烹制篇-Day17|开锅初尝:groupby 分组统计,按组分析数据

0 次阅读 2026-10-21 15:12

📖 知识点

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

⚠️ 易错提醒

  1. groupby 后必须跟一个聚合操作(sum/mean 等),否则只是分组对象,看不到结果
  2. groupby("菜系")["销量"] 里的 ["销量"] 是选择要统计的那一列
  3. 分组列通常是文本 / 类别字段,数值列才是被统计的对象

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份 "菜系销售" 数据(菜系、菜名、销量)
  2. 用 groupby("菜系") 按菜系分组
  3. 对 "销量" 列用 .sum() 求每组总和
  4. 再用 .mean() 求每组平均
  5. 打印两种统计结果,比较哪组卖得最好

参考代码

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) 都最高,是卖得最好的菜系。这就是分组统计的价值 —— 从混在一起的数据里发现规律。

🧠 思考题

  1. df.groupby("菜系")["销量"].sum() 里,"菜系"" 销量 ""sum" 三个部分各起什么作用?
  2. 不分组直接 df["销量"].sum() 得到的是所有菜的总销量;分组后得到什么?两者信息量有何不同?