行者孙Python

烹制篇-Day19|多味调和:多列分组 + 多指标聚合分析

📖 知识点

1. 多列分组

groupby 可以一次按多个字段分组(先按第一个、再按第二个细分):

# 按"菜系"和"时段"两层分组
df.groupby(["菜系", "时段"])["销量"].sum()

运行输出:

菜系  时段
川菜  午餐    60
     晚餐    80
鲁菜  午餐    40
     晚餐    50
Name: 销量, dtype: int64

两层分组后,可以精确看到 "川菜的午餐、晚餐各卖多少"。

2. 多列分组 + 多指标聚合(最强组合)

# 按菜系+时段分组,销量算sum和mean,同时计数
df.groupby(["菜系", "时段"])["销量"].agg(["sum", "mean", "count"])

3. 对多列各算不同指标

# 按菜系分组,销量求和、价格求均值
df.groupby("菜系").agg({"销量": "sum", "价格": "mean"})

agg({"销量":"sum", "价格":"mean"}) 用字典对不同列配不同聚合方法。

完整示例

import pandas as pd

data = {
    "菜系": ["川菜", "川菜", "鲁菜", "鲁菜"],
    "时段": ["午餐", "晚餐", "午餐", "晚餐"],
    "销量": [60, 80, 40, 50],
}
df = pd.DataFrame(data)

# 多列分组 + 多指标
print(df.groupby(["菜系", "时段"])["销量"].agg(["sum", "mean", "count"]))

运行输出:

           sum  mean  count
菜系 时段
川菜 午餐    60    60.0      1
    晚餐    80    80.0      1
鲁菜 午餐    40    40.0      1
    晚餐    50    50.0      1

💡 理解

  • 多列分组:groupby(["列1","列2"]) 按两层细分
  • 多指标聚合:.agg(["sum","mean","count"]) 一次算多个指标
  • 不同列不同聚合:.agg({"销量":"sum","价格":"mean"})
  • 三者可任意组合,得到精细分析表

⚠️ 易错提醒

  1. 多列分组时 groupby 里要传列表 ["a","b"]
  2. 多指标聚合 agg 里传列表 ["sum","mean"]
  3. 不同列不同聚合用字典,别混用格式

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份数据(菜系、时段、销量、价格)
  2. 用 groupby(["菜系","时段"]) 多列分组,对销量求和
  3. 用 .agg(["sum","mean"]) 对销量算多指标
  4. 用 .agg({"销量":"sum","价格":"mean"}) 对不同列不同聚合
  5. 打印结果,观察两层分组的精细统计

参考代码

import pandas as pd

data = {
    "菜系": ["川菜", "川菜", "鲁菜", "鲁菜", "粤菜", "粤菜"],
    "时段": ["午餐", "晚餐", "午餐", "晚餐", "午餐", "晚餐"],
    "销量": [60, 80, 40, 50, 30, 20],
    "价格": [20, 25, 35, 40, 30, 28],
}
df = pd.DataFrame(data)

# 多味调和1:多列分组,销量求和
print("===== 按菜系+时段分组,销量求和 =====")
print(df.groupby(["菜系", "时段"])["销量"].sum())

# 多味调和2:多列分组 + 多指标
print("\n===== 按菜系+时段分组,销量sum和mean =====")
print(df.groupby(["菜系", "时段"])["销量"].agg(["sum", "mean"]))

# 多味调和3:不同列不同聚合
print("\n===== 按菜系分组,销量求和、价格均值 =====")
print(df.groupby("菜系").agg({"销量": "sum", "价格": "mean"}))

运行输出:

===== 按菜系+时段分组,销量求和 =====
菜系  时段
川菜  午餐    60
     晚餐    80
鲁菜  午餐    40
     晚餐    50
粤菜  午餐    30
     晚餐    20
Name: 销量, dtype: int64

===== 按菜系+时段分组,销量sum和mean =====
          sum  mean
菜系 时段
川菜 午餐    60  60.0
    晚餐    80  80.0
鲁菜 午餐    40  40.0
    晚餐    50  50.0
粤菜 午餐    30  30.0
    晚餐    20  20.0

===== 按菜系分组,销量求和、价格均值 =====
     销量    价格
菜系
川菜  140  22.5
鲁菜   90  37.5
粤菜   50  29.0

🧠 思考题

  1. groupby(["菜系","时段"]) 相比只按 "菜系" 分组,分析信息精细在哪?
  2. 三种写法(多列分组、多指标 agg、字典 agg)各自适合什么场景?
‹ 返回目录
🏠首页 Python 📦资源 👤关于我