Python에는 다음과 유사한 팬더 데이터 프레임이 있습니다:
Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45 | 50 | 53 | Clothes
TV | 200 | 300 | 250 | Technology
Book | 20 | 17 | 21 | Books
phone| 300 | 350 | 400 | Technology
여기서 shop1, shop2, shop3은 서로 다른 상점에 있는 모든 품목의 비용입니다. 이제 다음과 같이 데이터를 정리한 후 데이터 프레임을 반환해야 합니다:
Category (index)| size| sum| mean | std
----------------------------------------
여기서 크기는 각 카테고리의 품목 수이고 합계, 평균 및 표준값은 3개 스토어에 적용된 동일한 함수와 관련이 있습니다. 분할-적용-결합 패턴(그룹별, 집계, 적용,...)을 사용하여 이러한 작업을 수행하려면 어떻게 해야 하나요?
누군가 나를 도와 줄 수 있습니까? 나는 이것으로 미쳐 가고있다... 감사합니다!
집계에 의한 그룹 내 사전 사용이 더 이상 사용되지 않는 것을 고려하여 판다 0.22 이상 버전에서 수정되었습니다.
우리는 사전의 키를 사용하여 함수를 지정하고 사전 자체를 사용하여 열의 이름을 바꾸는 매우 유사한 사전을 설정했습니다.
rnm_cols = dict(size='Size', sum='Sum', mean='Mean', std='Std')
df.set_index(['Category', 'Item']).stack().groupby('Category') \
.agg(rnm_cols.keys()).rename(columns=rnm_cols)
Size Sum Mean Std
Category
Books 3 58 19.333333 2.081666
Clothes 3 148 49.333333 4.041452
Technology 6 1800 300.000000 70.710678
옵션 1
사용 agg
← 문서 링크 사용
agg_funcs = dict(Size='size', Sum='sum', Mean='mean', Std='std')
df.set_index(['Category', 'Item']).stack().groupby(level=0).agg(agg_funcs)
Std Sum Mean Size
Category
Books 2.081666 58 19.333333 3
Clothes 4.041452 148 49.333333 3
Technology 70.710678 1800 300.000000 6
옵션 2
**적은 비용으로 더 많이**
사용 describe
← 문서 링크* 사용
df.set_index(['Category', 'Item']).stack().groupby(level=0).describe().unstack()
count mean std min 25% 50% 75% max
Category
Books 3.0 19.333333 2.081666 17.0 18.5 20.0 20.5 21.0
Clothes 3.0 49.333333 4.041452 45.0 47.5 50.0 51.5 53.0
Technology 6.0 300.000000 70.710678 200.0 262.5 300.0 337.5 400.0
df.groupby('Category').agg({'Item':'size','shop1':['sum','mean','std'],'shop2':['sum','mean','std'],'shop3':['sum','mean','std']})
또는 모든 상점에 적용하려면 모든 상점에 적용하세요:
df1 = df.set_index(['Item','Category']).stack().reset_index().rename(columns={'level_2':'Shops',0:'costs'})
df1.groupby('Category').agg({'Item':'size','costs':['sum','mean','std']})
제가 올바르게 이해했다면 모든 상점에 대한 집계 지표를 개별적으로 계산하는 것이 아니라 모든 상점에 대한 집계 지표를 계산하고 싶으신 것 같습니다. 이를 위해 먼저 데이터 프레임을 스택
한 다음 카테고리
를 기준으로 그룹화하면 됩니다:
stacked = df.set_index(['Item', 'Category']).stack().reset_index()
stacked.columns = ['Item', 'Category', 'Shop', 'Price']
stacked.groupby('Category').agg({'Price':['count','sum','mean','std']})
결과는 다음과 같습니다.
Price
count sum mean std
Category
Books 3 58 19.333333 2.081666
Clothes 3 148 49.333333 4.041452
Technology 6 1800 300.000000 70.710678