Python pandas分组聚合groupby实战
用groupby做分组求和、计数、均值、中位数,结合agg一次性多指标聚合,等价于SQL的GROUP BY,替代Excel数据透视表。
场景痛点
每月出报表要按部门算平均工资、按区域算销售额、按产品数订单量,Excel里拖透视表,字段一变就要重新拖。用pandas的groupby写好脚本,每次数据更新跑一遍,直接出新结果,还能一键导出Excel。
用到的库
pip install pandas
完整代码
import pandas as pd
def sample_df():
return pd.DataFrame({
"dept": ["技术", "市场", "技术", "市场", "人事", "技术"],
"level": ["P5", "P4", "P6", "P5", "P4", "P5"],
"salary": [15000, 12000, 25000, 13000, 9000, 16000],
"bonus": [5000, 3000, 10000, 4000, 1000, 6000],
})
def groupby_demo():
df = sample_df()
# 1. 单字段分组:按部门统计工资
print("--- 按部门平均工资 ---")
print(df.groupby("dept")["salary"].mean().round(2))
# 2. 多字段分组:部门+级别
print("\n--- 部门+级别 人数与平均工资 ---")
print(df.groupby(["dept", "level"]).agg(
人数=("salary", "count"),
平均工资=("salary", "mean"),
总奖金=("bonus", "sum"),
).round(2))
# 3. 多聚合函数:对一列同时算多个指标
print("\n--- 工资的多指标统计 ---")
print(df.groupby("dept")["salary"].agg(["count", "mean", "max", "min"]).round(2))
# 4. 分组后过滤:只保留平均工资大于12000的部门
print("\n--- 平均工资>12000的部门 ---")
result = df.groupby("dept").filter(lambda g: g["salary"].mean() > 12000)
print(result)
if __name__ == "__main__":
groupby_demo()
代码讲解
df.groupby("dept")["salary"].mean()是最常用写法:按dept分组,对salary求均值。groupby(["dept", "level"])多列分组,等价于Excel透视表多行标签。agg(新列名=(原列, 聚合函数))命名聚合,一次输出多个指标,列名直接起中文,业务方看得懂。- 聚合函数支持
count/mean/sum/max/min/median/std,也能传自定义函数。 groupby().filter(lambda g: ...)是分组后过滤整组,保留满足条件的组对应的原始行,和聚合后的筛选不同。
运行结果
控制台依次打印:按部门的平均工资、部门+级别的人数/平均工资/总奖金、工资多指标统计、以及过滤后只保留技术部的明细行。技术部3人平均工资约18666,市场部2人平均12500。
注意事项
- 分组前先确认分组字段没有NaN,否则NaN对应的组会被自动丢掉;用
df["dept"].fillna("未知")兜底。 - 聚合结果默认把分组列做成索引,
reset_index()还原成普通列,方便后续导出Excel。 - 大表分组时用
observed=True优化类别型字段的性能。 - 想做Excel数据透视表那种行/列交叉透视,用
pd.pivot_table(df, values="salary", index="dept", columns="level", aggfunc="mean")。

更新时间:2026-09-14 20:57:15