如何使用Pandas groupby.agg实现带条件的列聚合?
Pandas分组聚合:实现带条件与无条件列的求和
原始DataFrame
| name | sales | profit | profit_flag |
|---|---|---|---|
| Joe | 200 | 100 | True |
| Joe | 300 | 150 | False |
| Mark | 200 | 100 | True |
| Mark | 300 | 150 | True |
| Judy | 300 | 150 | False |
需求
按name分组聚合:
sales列无条件求和profit列仅在profit_flag为True时求和
预期结果
| name | sales | profit |
|---|---|---|
| Joe | 500 | 100 |
| Judy | 300 | NaN |
| Mark | 500 | 250 |
一行agg实现方案
可以直接用groupby.agg()一行代码完成所有聚合逻辑,无需分开处理:
grouped = df.groupby('name').agg( sales=('sales', 'sum'), profit=lambda x: x['profit'][x['profit_flag']].sum() if x['profit_flag'].any() else pd.NA ).reset_index()
代码说明
sales=('sales', 'sum'):直接对sales列执行无条件求和- 针对
profit列的lambda函数:- 每个分组的子DataFrame会被传入lambda参数
x - 筛选出当前分组中
profit_flag为True的profit值求和 - 如果分组内没有
profit_flag=True的行,返回pd.NA(与预期的NaN一致)
- 每个分组的子DataFrame会被传入lambda参数
这种方式可以轻松扩展到大量列的场景,把所有需要聚合的规则统一写在agg的参数中,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Samba
相关产品推荐
相关产品推荐

