繁体   English   中英

Pandas groupby.agg 有条件

[英]Pandas groupby.agg with condition

我有一个类似于此的 pandas 数据框:

名称 销售量 利润 利润标志
200 100 真的
300 150 错误的
标记 200 100 真的
标记 300 150 真的
朱蒂 300 150 错误的

实际数据框有 100 列。

这个想法是:我想按名称分组,并聚合所有列。 但是,某些列取决于标志。 在这种情况下,无论如何都会汇总sales ,但只有当profit_flagTrue时, profit才应包含在汇总中。

如果我们使用sum ,它应该看起来像这样:

名称 销售量 利润
500 100
朱蒂 300
标记 500 250

无论如何,我可以使用df.groupby('name').agg()从一行中做到这一点吗?

现在我正在使用:

grouped = pd.DataFrame()
grouped['sales'] = df.groupby('name').sales.sum()
grouped['profit'] = df[df.profit_flag].groupby('name').profit.sum()

我得到了正确的结果,但由于实际的数据框有更多的列,我想知道我是否可以以某种方式写这样的东西来避免混乱:

grouped = df.groupby('name').agg({
          'sales': 'sum',
          'profit' 'sum' #if profit_flag })

这甚至可能还是我应该将“标志相关列”分组在单独的状态中?

您可以在聚合之前屏蔽这些值:

(df.assign(profit=lambda d: d['profit'].where(d['profit_flag']))
   .groupby('name', as_index=False)[['sales', 'profit']].sum(min_count=1)
)

Output:

   name  sales  profit
0   Joe    500   100.0
1  Judy    300     NaN
2  Mark    500   250.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM