You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 15:03:04