Pandas groupby聚合与transform/filter/apply的区别
请详细说明Pandas中groupby操作后.agg()、.transform()、.filter()、.apply()四种方法的区别和使用场景。给出以下场景的代码:
- 计算每个组的均值并添加到原DataFrame
- 筛选出组内成员数大于5的组
- 对每组进行标准化(z-score)
- 对每组应用自定义复杂函数
回答
编译有声
核心区别:
| 方法 | 聚合方式 | 返回形状 | 典型场景 |
|------|---------|---------|---------|
| 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。