【问题标题】:Calculation over pandas groupby object with condition within groups使用组内条件计算 pandas groupby 对象
【发布时间】:2022-07-26 22:13:44
【问题描述】:

我有一个df,如下:

    appid   month    tag totalvalue
0   1234    02-'22   B   50.00
1   1234    02-'22   BA  10.00
2   1234    01-'22   B   100.00
3   2345    03-'22   BA  25.00
4   2345    03-'22   BCS 15.00
5   2345    03-'22   B   100.00     

输出我想要的如下:

    appid   month    tag totalvalue  %tage
0   1234    02-'22   B   50.00       1.0
1   1234    02-'22   BA  10.00       0.2
2   1234    01-'22   B   100.00      1.0
3   2345    03-'22   BA  25.00       0.25
4   2345    03-'22   B   100.00      1.0  
5   2345    04-'22   BB  100.00      inf

我想要基于appidmonth 的组变量。此外要检查是否有tag=B 可用,因为group 只需将其他tagtotalvalue 与它分开即可。如果没有显示inf

我已尝试使用df.groupby(['appid', 'month'])['totalvalue'],但无法以tag=B 作为groupby 对象的分母来复制它们。

【问题讨论】:

  • 您的输入与最后两行中月份/标签/总值的输出不同

标签: pandas group-by division


【解决方案1】:

IIUC,您可以在屏蔽的总值上使用groupby.transform('first'),然后将其用作除法器:

m = df['tag'].eq('B')

df['%tage'] = (df['totalvalue']
               .div(df['totalvalue'].where(m)
                    .groupby([df['appid'], df['month']])
                    .transform('first').fillna(0))
              )

输出:

   appid   month tag  totalvalue  %tage
0   1234  02-'22   B        50.0   1.00
1   1234  02-'22  BA        10.0   0.20
2   1234  01-'22   B       100.0   1.00
3   2345  03-'22  BA        25.0   0.25
4   2345  03-'22   B       100.0   1.00
5   2345  04-'22  BB       100.0    inf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2015-08-23
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多