自学教程 学编程从这里开始

Pandas groupby 分组聚合

说明:本篇为基础版 groupby 教程,适合入门,讲解分组的核心思想、基础语法、常用聚合、多列分组、as_index、reset_index。
核心思想:Split-Apply-Combine(拆分 → 应用函数 → 合并结果)

1. 环境准备 & 测试数据

pip install pandas
import pandas as pd

df = pd.DataFrame({
    "地区": ["华东", "华东", "华南", "华南", "华东", "华南"],
    "产品": ["A", "B", "A", "B", "A", "B"],
    "销售额": [150, 200, 120, 180, 130, 210],
    "成本": [80, 110, 70, 95, 75, 120]
})
print(df)

2. 最简单分组:单列分组

# 按【地区】分组,对销售额求和
res = df.groupby("地区")["销售额"].sum()
print(res)

输出是 Series,分组字段变成索引。

常用内置聚合函数

  • sum() 求和
  • mean() 平均值
  • count() 非空数量
  • size() 分组总行数(包含NaN)
  • max() 最大值
  • min() 最小值
  • std() 标准差
  • nunique() 分组内不重复值个数
res = df.groupby("地区")["销售额"].mean()
print(res)

3. as_index=False(非常常用)

默认 groupby 会把分组列作为索引;as_index=False 直接输出普通 DataFrame,方便后续导出、合并:

res = df.groupby("地区", as_index=False)["销售额"].sum()
print(res)

等价写法:先分组,再 reset_index()

res = df.groupby("地区")["销售额"].sum().reset_index()
print(res)

4. agg() 一次统计多个指标

4.1 同一列多个聚合

res = df.groupby("地区", as_index=False)["销售额"].agg(["sum", "mean", "max"])
print(res)

缺点:列名是多层,推荐命名聚合(Pandas 0.25+)

res = df.groupby("地区", as_index=False).agg(
    销售总额 = ("销售额", "sum"),
    销售均值 = ("销售额", "mean"),
    最大销售额 = ("销售额", "max")
)
print(res)

4.2 不同列使用不同聚合

res = df.groupby("地区", as_index=False).agg({
    "销售额": ["sum", "max"],
    "成本": ["sum", "min"]
})
# 扁平化多层列名
res.columns = ["地区", "销售额_sum", "销售额_max", "成本_sum", "成本_min"]
print(res)

5. 多列分组(多个维度)

先按地区,再按产品分组:

res = df.groupby(["地区", "产品"], as_index=False)["销售额"].sum()
print(res)

分组顺序很重要:先粗维度,后细维度。

6. 查看分组信息

g = df.groupby("地区")
# 查看所有分组key
print(g.groups)
# 获取指定分组的数据
print(g.get_group("华东"))
# 每个分组行数
print(g.size())

7. 分组后筛选列

# 只聚合销售额
res = df.groupby("地区")["销售额"].sum()
# 多列同时聚合
res = df.groupby("地区")[["销售额", "成本"]].sum()

8. 基础综合示例

import pandas as pd

df = pd.DataFrame({
    "地区": ["华东", "华东", "华南", "华南", "华东", "华南"],
    "产品": ["A", "B", "A", "B", "A", "B"],
    "销售额": [150, 200, 120, 180, 130, 210],
    "成本": [80, 110, 70, 95, 75, 120]
})

# 多维度分组 + 命名聚合
summary = df.groupby(["地区", "产品"], as_index=False).agg(
    销售总额 = ("销售额", "sum"),
    成本总额 = ("成本", "sum")
)
summary["毛利"] = summary["销售总额"] - summary["成本总额"]
print(summary)
summary.to_excel("groupby_result.xlsx", index=False)

9. 基础避坑

  1. 分组字段有 NaN,NaN 会单独作为一个分组;
  2. count() 统计非空值,size() 统计行数;
  3. 想要普通表结构,优先加上 as_index=False;
  4. 分组后如果要导出Excel,一定要 reset_index() 或者 as_index=False,否则索引会丢失。

10. 基础版 vs 进阶版

  • 本篇:groupby + agg、单列/多列分组、as_index,适合常规报表汇总
  • 进阶篇:filter、transform、apply、rolling、Grouper 时间分组、分组排名
标签:

0 条笔记