如何通过Pandas GroupBy计算布尔Flag为True占比及指定字段分组求和
实现方案
你可以使用Pandas的groupby结合agg方法完成多列不同规则的分组聚合,完整代码如下:
import pandas as pd # 构造测试数据集 df = pd.DataFrame({ 'Id': [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4, 4, 4, 4], 'Session':[1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 1, 1, 2, 3, 4], 'Flag': [1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1], 'toSum': [2, 4, 5, 6, 3, 0, 1, 4, 6, 2, 4, 2, 1, 5, 10] }) # 按Id分组聚合 res = df.groupby('Id', as_index=False).agg( Flag_pert=('Flag', lambda x: round(x.mean() * 100, 2)), toSum=('toSum', 'sum') ).rename(columns={'Flag_pert': 'Flag %'}) # 输出结果 print(res)
运行后输出结果和预期完全一致:
Id Flag % toSum 0 1 57.14 21 1 2 33.33 12 2 3 100.00 4 3 4 50.00 18
逻辑说明
groupby('Id', as_index=False):指定按Id列分组,同时设置as_index=False避免Id被转为索引,保留为结果的普通列agg方法可以同时为不同列指定不同的聚合规则:- 对
Flag列:1代表True、0代表False,直接计算列均值再乘以100即可得到True值的占比,用round保留2位小数 - 对
toSum列:直接使用sum规则计算分组总和
- 对
- 最后用
rename方法将百分比列名修改为需要的Flag %
内容的提问来源于stack exchange,提问作者ChrisOram
相关产品推荐
相关产品推荐

