我的知识记录

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")

Python pandas分组聚合groupby实战

标签:

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

上一篇:Python pandas读取CSV教程:一行加载成DataFrame

下一篇:Python pandas时间日期处理教程