核心要点
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 一致。下面示例覆盖这三个核心操作。
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 才能当普通列使用。
追问
追问 1:agg 和 transform 的区别是什么?什么时候用 transform?
agg 做聚合,每组返回一个标量、结果行数等于组数;transform 返回与输入等长的序列、把组内计算结果广播回每一行,结果行数等于原表行数。当你需要把组级统计「贴回」明细行时(如计算每行占组内总和的比例、用组均值/中位数填充该组缺失值、做组内标准化),就用 transform;只要汇总表就用 agg。
追问 2:Pandas 里如何实现 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)。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。