核心要点

  • groupby(键).agg({列:函数}) 分组聚合,可对不同列指定不同函数并命名输出列

  • transform 返回与原表等长的结果(广播回每行),适合做组内占比、组均值填充等

  • merge(df2, on=键, how='left/inner/outer') 等价 SQL 的 JOIN,how 控制保留哪侧

  • 易错点:merge 关联键重复会行放大;count 不计 NaN,size 计全部;多重聚合后需 reset_index

标准回答

groupby 把数据按键分组后接聚合:agg 可对多列指定多种函数并自定义输出列名,是最常用的分组统计入口。transform 与 agg 不同,它返回和原表等长的结果、会广播回每一行,特别适合算「组内占比」「用组均值填缺失」这类需要保留行粒度的场景。merge 则对应 SQL 的 JOIN,用 on 指定关联键、how 指定连接方式(left/inner/outer/right),语义与 SQL 一致。下面示例覆盖这三个核心操作。

python
import pandas as pd

# 1) groupby + agg:按部门聚合多指标,并自定义输出列名
dept_stat = (
    df.groupby('dept_id')
      .agg(
          avg_salary=('salary', 'mean'),   # 平均薪资
          total_pay=('salary', 'sum'),     # 薪资总额
          headcount=('emp_id', 'count'),   # 人数(不计 NaN)
      )
      .reset_index()                       # 把分组键从索引还原为列
)

# 2) transform:算每个人薪资占本部门总额的比例(广播回原行)
df['salary_ratio'] = (
    df['salary'] / df.groupby('dept_id')['salary'].transform('sum')
)

# 3) merge:把部门维表关联进来(等价 SQL 的 LEFT JOIN)
result = df.merge(dept_stat, on='dept_id', how='left')

print(result.head())

常见误区

⚠️ 常见踩坑

agg 用 mean/count 会忽略 NaN(count 不计缺失,size 才计全部),统计口径要看清;merge 关联键有重复会发生行放大,合并后行数暴增;以及 groupby 后结果分组键在索引上,需 reset_index 才能当普通列使用。

追问

追问 1agg 和 transform 的区别是什么?什么时候用 transform?

agg 做聚合,每组返回一个标量、结果行数等于组数;transform 返回与输入等长的序列、把组内计算结果广播回每一行,结果行数等于原表行数。当你需要把组级统计「贴回」明细行时(如计算每行占组内总和的比例、用组均值/中位数填充该组缺失值、做组内标准化),就用 transform;只要汇总表就用 agg。

追问 2Pandas 里如何实现 SQL 的 GROUP BY 后取每组 Top-N?

两种常用写法:sort_values 后 groupby().head(N),如 df.sort_values('salary', ascending=False).groupby('dept_id').head(2) 取每部门薪资前 2;或用 groupby + rank:df['rk']=df.groupby('dept_id')['salary'].rank(method='first', ascending=False),再 df[df.rk<=2],对应 SQL 的 ROW_NUMBER() 套路。rank 的 method 参数控制并列处理(first/min/dense)。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。