说明:本篇为基础版 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. 基础避坑
- 分组字段有 NaN,NaN 会单独作为一个分组;
count()统计非空值,size()统计行数;- 想要普通表结构,优先加上
as_index=False; - 分组后如果要导出Excel,一定要
reset_index()或者as_index=False,否则索引会丢失。
10. 基础版 vs 进阶版
- 本篇:
groupby+agg、单列/多列分组、as_index,适合常规报表汇总 - 进阶篇:
filter、transform、apply、rolling、Grouper时间分组、分组排名
0 条笔记