Python pandas groupby aggregate on multiple columns, then pivot

前端 未结 3 841
野性不改
野性不改 2020-12-13 10:08

In Python, I have a pandas DataFrame similar to the following:

Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45    | 50         


        
3条回答
  •  暖寄归人
    2020-12-13 10:35

    Edited for Pandas 0.22+ considering the deprecation of the use of dictionaries in a group by aggregation.

    We set up a very similar dictionary where we use the keys of the dictionary to specify our functions and the dictionary itself to rename the columns.

    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
    

    option 1
    use agg ← link to docs

    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
    

    option 2
    more for less
    use describe ← link to docs

    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
    

提交回复
热议问题