[英]Pandas groupby.agg with condition
我有一个类似于此的 pandas 数据框:
名称 | 销售量 | 利润 | 利润标志 |
---|---|---|---|
乔 | 200 | 100 | 真的 |
乔 | 300 | 150 | 错误的 |
标记 | 200 | 100 | 真的 |
标记 | 300 | 150 | 真的 |
朱蒂 | 300 | 150 | 错误的 |
实际数据框有 100 列。
这个想法是:我想按名称分组,并聚合所有列。 但是,某些列取决于标志。 在这种情况下,无论如何都会汇总sales
,但只有当profit_flag
为True时, 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.