여러 열에 그룹별로 집계한 다음 피벗하는 Python 판다 그룹화

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
해설 (2)
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']})
해설 (0)

제가 올바르게 이해했다면 모든 상점에 대한 집계 지표를 개별적으로 계산하는 것이 아니라 모든 상점에 대한 집계 지표를 계산하고 싶으신 것 같습니다. 이를 위해 먼저 데이터 프레임을 스택한 다음 카테고리를 기준으로 그룹화하면 됩니다:

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
해설 (0)