Pandas分组后如何对不同列分别执行求和、求平均等不同聚合操作
你可以直接使用 pandas 内置的 agg() 方法实现该需求,这个方法本身就支持为不同列指定不同的聚合规则,后续新增聚合规则也只需要修改对应配置即可,非常灵活。
实现步骤
- 首先调整字段筛选逻辑,把后续要用到的
Bid字段也加入待处理数据中 - 分组时使用
agg()方法指定各字段的聚合规则,推荐使用 pandas 0.25 版本新增的命名聚合语法,可以直接指定聚合后的字段名,无需额外重命名:
# 筛选所有需要用到的字段 db_profit_platform = db[['Source','Device','Country','Profit','Bid']] # 分组 + 多列不同聚合,as_index=False 可以避免后续再调用reset_index() db_profit_final = db_profit_platform.groupby( ['Source','Device','Country'], as_index=False ).agg( SumProfit = ('Profit', 'sum'), # 对Profit列求和,结果列名为SumProfit AverageBid = ('Bid', 'mean') # 对Bid列求平均值,结果列名为AverageBid )
如果你使用的pandas版本低于0.25,不支持命名聚合语法,可以用字典传入聚合规则,执行完成后再重命名列即可:
# 低版本兼容写法 db_profit_platform = db[['Source','Device','Country','Profit','Bid']] db_profit_final = db_profit_platform.groupby( ['Source','Device','Country'], as_index=False ).agg({ 'Profit': 'sum', 'Bid': 'mean' }) # 重命名为需要的字段名 db_profit_final.rename(columns={ 'Profit': 'SumProfit', 'Bid': 'AverageBid' }, inplace=True)
后续扩展方式
如果后续需要新增其他聚合规则,只需要做两处调整即可:
- 把新的待聚合字段加入第一步的筛选列表中
- 在
agg()的参数里新增对应配置即可,比如要新增统计每个分组的订单量字段OrderCount,只需要加一行OrderCount = ('Order', 'count')(命名聚合写法),或者在字典里加'Order': 'count'再补充重命名规则即可。
另外注意原来代码里用apply(sum)的写法性能远低于pandas内置的sum聚合,推荐直接使用内置聚合函数,处理大数据量时差异会非常明显。
内容的提问来源于stack exchange,提问作者Costa
相关产品推荐
相关产品推荐

