Pandas使用groupby.apply实现分组多聚合及自定义列名问题
Pandas groupby 多聚合结果实现方案
方案1:自定义apply函数返回Series(适配全自定义复杂聚合场景)
该方案完全保留apply访问分组内全量数据的能力,可同时返回任意多个聚合结果,直接指定结果列名,符合所有需求,示例代码如下:
import pandas as pd def custom_group_agg(group): # 可自由访问分组内所有列的数据 price_col = group['Price'] volume_col = group['Volume'] # 加权平均计算 weighted_avg_price = (volume_col * price_col).sum() / volume_col.sum() # 分组Volume总和 total_volume = volume_col.sum() # 可按需新增任意其他聚合逻辑,示例新增平均价格、成交笔数 avg_price = price_col.mean() trade_cnt = len(group) # 返回Series,索引值即为最终结果的列名 return pd.Series( [weighted_avg_price, total_volume, avg_price, trade_cnt], index=['weighted_avg_price', 'total_volume', 'avg_price', 'trade_count'] ) df = pd.DataFrame(data=data) result = df.groupby('Category').apply(custom_group_agg).reset_index()
方案优势:
- 支持任意复杂的多列关联聚合逻辑
- 无需额外处理列名,返回的Series索引直接对应结果列名,不会生成默认名为
0的列 - 新增聚合指标仅需要在返回的Series中添加对应条目即可
方案2:使用agg命名聚合语法(适配内置聚合+自定义聚合混合场景)
如果部分聚合逻辑可直接使用Pandas内置聚合函数,优先使用该方案,性能比纯自定义apply更高,同时支持传入访问全部分组数据的自定义函数:
# 自定义加权平均函数,入参为完整分组DataFrame def calc_wavg(group): return (group['Volume'] * group['Price']).sum() / group['Volume'].sum() df = pd.DataFrame(data=data) result = df.groupby('Category').agg( # 直接指定列名与对应的聚合逻辑 weighted_avg_price = calc_wavg, total_volume = ('Volume', 'sum'), avg_price = ('Price', 'mean'), trade_count = ('Price', 'count') ).reset_index()
方案特点:
- 内置聚合逻辑直接调用Pandas优化过的方法,执行效率更高
- 命名聚合语法直接定义结果列名,写法更简洁
- 自定义函数同样可以访问分组内所有列,满足多列关联计算需求
注意:数据量较大时,优先将独立列的聚合逻辑用内置方法实现,可显著提升运行效率
内容的提问来源于stack exchange,提问作者Markus A Noren
相关产品推荐
相关产品推荐

