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
相关产品推荐
相关产品推荐

