[英]Pandas group by multiple custom aggregate function on multiple columns
給定數據:
組 | 數據1 | 數據2 | 數據3 |
---|---|---|---|
一種 | 2個 | 1個 | 2個 |
一種 | 4個 | 6個 | 3個 |
b | 3個 | 2個 | 1個 |
b | 7 | 3個 | 5個 |
預計 output:
組 | 總和(數據1) | 總和(數據 2)/總和(數據 1) | 總和(數據 3)/總和(數據 1) |
---|---|---|---|
一種 | 6個 | 1.166666667 | 0.83 |
一種 | 10 | 0.5 | 0.6 |
假設自定義聚合可以依賴於多個列,而不總是一個簡單的除法運算。 我知道使用 SQL 查詢是可能的,但我對應用和聚合 function 的答案感興趣,如果可能的話。
你可以這樣做:
df2 = df.groupby('grp').sum()
df2.update(df2.drop(columns='data1').div(df2['data1'], axis=0))
或更經典:
df2 = df.groupby('grp').sum()
df2[['data2', 'data3']] = df2[['data2', 'data3']].div(df2['data1'], axis=0)
output:
data1 data2 data3
grp
a 6 1.166667 0.833333
b 10 0.500000 0.600000
您可以對 MultiIndex 使用相同的邏輯:
df2 = df.groupby('grp').agg(['sum', 'mean'])
df2.update(df2.drop(columns='data1').stack(0).div(df2['data1'], axis=0).unstack())
output:
data1 data2 data3
sum mean sum mean sum mean
grp
a 6 3.0 7 3.5 5 2.5
b 10 5.0 5 2.5 6 3.0
您可以在此處使用 groupby + assign 來生成所需的聚合。 您可以應用任何需要的聚合 function。
g = df.groupby('grp')
# for custom agg func use .agg(custom_agg_func)
# ^^^^^
g[['data1']].agg('sum').assign(sum2 = lambda df: g['data2'].sum()/df['data1'],
sum3 = lambda df: g['data3'].sum()/df['data1'])
# ^^^^^^
# you can use custom agg func of your choice
data1 sum2 sum3
grp
a 6 1.166667 0.833333
b 10 0.500000 0.600000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.