簡體   English   中英

Pandas 按多個自定義聚合分組 function 在多個列上

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM