[英]Python pandas groupby aggregate on multiple columns, then pivot
在Python中,我有一個類似於以下的pandas DataFrame:
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是不同商店中每件商品的成本。 現在,我需要在一些數據清理后返回一個DataFrame,如下所示:
Category (index)| size| sum| mean | std
----------------------------------------
其中size是每個Category中的項目數和sum,mean和std與應用於3個商店的相同功能相關。 如何使用split-apply-combine模式(groupby,aggregate,apply,...)執行這些操作?
有人可以幫我嗎? 我對這個瘋狂了......謝謝!
編輯Pandas 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
←鏈接到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
選項2
更多,更少
使用describe
←鏈接到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
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']})
如果我理解正確,您希望計算所有商店的匯總指標,而不是單獨計算每個商店的匯總指標。 為此,您可以先stack
數據幀,然后按Category
分組:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.