CodeWalk

Pandas groupby聚合与transform/filter/apply的区别

作者:编译有声 · 2026-05-30 12:55

请详细说明Pandas中groupby操作后.agg().transform().filter().apply()四种方法的区别和使用场景。给出以下场景的代码:

  1. 计算每个组的均值并添加到原DataFrame
  2. 筛选出组内成员数大于5的组
  3. 对每组进行标准化(z-score)
  4. 对每组应用自定义复杂函数

回答

编译有声

核心区别: | 方法 | 聚合方式 | 返回形状 | 典型场景 | |------|---------|---------|---------| | agg() | 每列一个值 | 组数×列数 | 统计汇总 | | transform() | 广播到每行 | 与原DataFrame同形状 | 添加组统计列 | | filter() | 按组条件筛选 | 行子集 | 删除小样本组 | | apply() | 任意函数 | 灵活 | 无法用前3种实现时 |

import pandas as pd
df = pd.DataFrame({'group': ['A','A','B','B','B'], 'val': [1,2,3,4,5]})

# 1. transform:组均值作为新列
df['group_mean'] = df.groupby('group')['val'].transform('mean')

# 2. filter:保留成员≥3的组
df_filtered = df.groupby('group').filter(lambda x: len(x) >= 3)

# 3. transform标准化
from scipy.stats import zscore
df['zscore'] = df.groupby('group')['val'].transform(lambda x: (x - x.mean()) / x.std())

# 4. agg多聚合
df.groupby('group')['val'].agg(['mean', 'std', 'count'])

性能顺序agg/transform(内置函数) > filter > transform/apply(lambda)。优先用内置'mean'等字符串而非lambda。