熊猫组通过多个列上的多个自定义汇总函数

发布于 2025-01-19 16:01:38 字数 1702 浏览 0 评论 0原文

给定数据:

GRPData1Data2Data3
A212
A463
B321
B735

预期输出:

GRPSUM(DATA1)SUM(DATA2)/SUM/SUM(DATA1)SUM(DATA3)/SUM/SUM(DATADA)
A61.166666670.83
A100.50.6

假设自定义聚合可以取决于多个列,并且并非总是一个简单的分裂操作。我知道使用SQL查询是可能的,但是如果可能的话,我对应用和汇总功能的答案感兴趣。

Given data:

grpdata1data2data3
a212
a463
b321
b735

Expected output:

grpsum(data1)sum(data2)/sum(data1)sum(data3)/sum(data1)
a61.1666666670.83
a100.50.6

Assume custom aggregation can be dependent on multiple columns and not always a simple division operation. I know using SQL query it's possible, but I am interested in an answer with apply and aggregate function if possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时常饿 2025-01-26 16:01:38

您可以在此处使用 groupby + allocate 来生成所需的聚合。您可以应用所需的任何聚合函数。

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

You can use groupby + assign here to generate required aggregations. You can apply whatever aggregate function is needed.

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
始终不够爱げ你 2025-01-26 16:01:38

您可以执行以下操作:

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)

输出:

     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())

输出使用相同的逻辑:

    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

You could do:

df2 = df.groupby('grp').sum()
df2.update(df2.drop(columns='data1').div(df2['data1'], axis=0))

or more classically:

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
multiple aggregation

You can use the same logic with a 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文