📖 知识点
1. 为什么要分组?
原始数据是 "一盘散沙",看不出规律。按某个维度分组(如按 "菜系" 分、按 "月份" 分),再对每组算总和 / 均值,才能发现 "哪个菜系卖得好、哪个月销量高"。
💡 生活比喻 一堆混在一起的食材看不出名堂;groupby 就像把它们按 "荤素"" 种类 " 分篮装好,再数数每篮有多少 —— 规律一下就清楚了。
2. groupby 基础用法
# 按"菜系"分组,对"销量"求和
df.groupby("菜系")["销量"].sum()
运行输出:
菜系
川菜 150
鲁菜 100
粤菜 80
Name: 销量, dtype: int64
groupby("菜系")先分组,["销量"]选要统计的列,.sum()做求和。
3. 常用聚合
| 聚合方法 | 作用 |
|---|---|
.sum() | 求和 |
.mean() | 均值 |
.max() / .min() | 最大 / 最小 |
.count() | 计数 |
.agg() | 自定义多个聚合(Day18) |
4. 分组统计其他列
# 按"菜系"分组,对"价格"求均值
df.groupby("菜系")["价格"].mean()
# 按"菜系"分组,对多个列求和
df.groupby("菜系")[["销量", "销售额"]].sum()
完整示例
import pandas as pd
data = {
"菜系": ["川菜", "鲁菜", "川菜", "粤菜", "鲁菜", "粤菜"],
"菜名": ["麻婆豆腐", "葱爆羊肉", "回锅肉", "白切鸡", "糖醋鱼", "叉烧"],
"销量": [60, 40, 80, 30, 50, 20],
}
df = pd.DataFrame(data)
# 按菜系分组,对销量求和
print(df.groupby("菜系")["销量"].sum())
运行输出:
菜系
川菜 140
鲁菜 90
粤菜 50
Name: 销量, dtype: int64
⚠️ 易错提醒
groupby后必须跟一个聚合操作(sum/mean 等),否则只是分组对象,看不到结果groupby("菜系")["销量"]里的["销量"]是选择要统计的那一列- 分组列通常是文本 / 类别字段,数值列才是被统计的对象
⚔️ Kata 实战任务
任务需求:
- 导入 pandas,创建一份 "菜系销售" 数据(菜系、菜名、销量)
- 用
groupby("菜系")按菜系分组 - 对 "销量" 列用
.sum()求每组总和 - 再用
.mean()求每组平均 - 打印两种统计结果,比较哪组卖得最好
参考代码
import pandas as pd
data = {
"菜系": ["川菜", "鲁菜", "川菜", "粤菜", "鲁菜", "粤菜"],
"菜名": ["麻婆豆腐", "葱爆羊肉", "回锅肉", "白切鸡", "糖醋鱼", "叉烧"],
"销量": [60, 40, 80, 30, 50, 20],
}
df = pd.DataFrame(data)
print("===== 原始数据 =====")
print(df)
# 开锅初尝:按菜系分组
print("\n===== 按菜系分组,销量求和 =====")
print(df.groupby("菜系")["销量"].sum())
print("\n===== 按菜系分组,销量均值 =====")
print(df.groupby("菜系")["销量"].mean())
运行输出:
===== 原始数据 =====
菜系 菜名 销量
0 川菜 麻婆豆腐 60
1 鲁菜 葱爆羊肉 40
2 川菜 回锅肉 80
3 粤菜 白切鸡 30
4 鲁菜 糖醋鱼 50
5 粤菜 叉烧 20
===== 按菜系分组,销量求和 ====="
菜系
川菜 140
鲁菜 90
粤菜 50
Name: 销量, dtype: int64
===== 按菜系分组,销量均值 =====
菜系
川菜 70.0
鲁菜 45.0
粤菜 25.0
Name: 销量, dtype: int64
💡 观察:分组后一眼看出 "川菜" 销量总和 (140) 和均值 (70) 都最高,是卖得最好的菜系。这就是分组统计的价值 —— 从混在一起的数据里发现规律。
🧠 思考题
df.groupby("菜系")["销量"].sum()里,"菜系"" 销量 ""sum" 三个部分各起什么作用?- 不分组直接
df["销量"].sum()得到的是所有菜的总销量;分组后得到什么?两者信息量有何不同?
行者孙Python