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

Pandas中groupby的agg、apply、transform函数行为差异解析

Pandas groupby 中 agg、apply、transform 三者的区别与行为解析

先看你给出的测试代码:

data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'Value': [10, 15, 20, 25, 30, 35]
}

df = pd.DataFrame(data)

df1 = df.groupby('Category').agg({'Value': 'mean'})
df2 = df.groupby('Category').apply(lambda x: x.mean())
df3 = df.groupby('Category')['Value'].transform('mean').to_frame()

print(f'{df1=}', f'{df2=}', f'{df3=}', sep='\n\n')

结合输出结果,逐个拆解三个函数的核心行为:

1. agg():精准指定列的聚合工具

agg() 是专门为聚合操作设计的函数,核心特点是精准控制列与聚合逻辑的对应关系:

  • 你传入的{'Value': 'mean'}明确要求:仅对分组后的Value列计算均值。
  • 输出结果df1是每个分组一行的汇总表,索引为分组键Category,行数等于分组数量(这里2行),属于典型的“数据压缩”型聚合结果。

2. apply():灵活度拉满的组级操作器

apply() 是个万能组级工具——它会把每个分组对应的完整子DataFrame传给你定义的函数,最终结果完全由函数的返回值决定:

  • 例子里的lambda x: x.mean(),x是每个分组的子DataFrame(比如A组是包含3行的完整DataFrame),调用x.mean()会计算该子DataFrame所有数值列的均值(这里只有Value列)。
  • 这次输出和agg()看起来一致,是因为函数返回的是标量(均值),最终被整理成组级汇总表。但apply()的灵活性远不止于此:你可以在函数里写任意逻辑,比如先过滤分组内的异常值再计算,或者返回多列结果,这些都是agg()无法实现的。

3. transform():把组级结果广播到每一行

transform() 的核心逻辑是严格保持原数据的行数,它会把组级计算结果,复制填充到该组的每一行上:

  • 例子里对Value列求组均值,A组的均值是18.3333,原DataFrame中所有属于A组的行(第0、1、4行)都会填充这个值;B组同理。
  • 输出df3的行数和原DataFrame完全一致(6行),这是它和前两个函数最本质的区别——前两个是“压缩”数据到组级,而transform()是“扩展”组级结果到每一行,常用于给原数据添加组级统计特征的场景。

内容的提问来源于stack exchange,提问作者VERBOSE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:34:52