行者孙Python

烹制篇-Day20|透视起锅:pivot_table 数据透视表

📖 知识点

1. 什么是数据透视表?

透视表把数据重新 "摆盘":一个维度放行、一个维度放列,交叉格子填统计值。比如行 = 菜系、列 = 时段、格子 = 销量,一张表看清 "每个菜系在午 / 晚餐的销量"。

💡 生活比喻 多列分组的结果是 "一长串",透视表把它 "摊平" 成表格 —— 行是菜系、列是时段,纵横交叉,一目了然。

2. pivot_table 基础语法

df.pivot_table(values="销量", index="菜系", columns="时段", aggfunc="sum")
  • values:要统计的列(数值)
  • index:放 "行" 的维度
  • columns:放 "列" 的维度
  • aggfunc:聚合方式(sum/mean 等),默认 mean

运行输出:

时段   午餐  晚餐
菜系
川菜    60   80
鲁菜    40   50
粤菜    30   20

3. 对比多列分组

# 分组写法:竖着的一串
df.groupby(["菜系","时段"])["销量"].sum()
# 透视写法:横竖摊平的表格
df.pivot_table(values="销量", index="菜系", columns="时段", aggfunc="sum")

两者数据一样,但透视表更直观,适合把结果直接 "看" 出来。

⚠️ 易错提醒

  1. pivot_table 的参数名是 values(统计列)、index(行维度)、columns(列维度)、aggfunc(聚合方式)
  2. aggfunc 默认是 mean(均值),想求和要显式写 aggfunc="sum"
  3. 别忘了 values,它决定中间格子里填哪列的数据

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份数据(菜系、时段、销量、价格)
  2. 用 pivot_table(values="销量", index="菜系", columns="时段", aggfunc="sum") 生成透视表
  3. 用 aggfunc="mean" 再生成一张均值透视表
  4. 打印两张透视表,对比 sum 和 mean
  5. 观察行 × 列交叉的统计规律

参考代码

import pandas as pd

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

# 透视起锅:生成透视表
print("===== 透视表:菜系(行) × 时段(列),销量求和 =====")
print(df.pivot_table(values="销量", index="菜系", columns="时段", aggfunc="sum"))

print("\n===== 透视表:销量均值 =====")
print(df.pivot_table(values="销量", index="菜系", columns="时段", aggfunc="mean"))

运行输出:

===== 透视表:菜系(行) × 时段(列),销量求和 =====
时段   午餐  晚餐
菜系
川菜    60   80
鲁菜    40   50
粤菜    30   20

===== 透视表:销量均值 =====
时段   午餐  晚餐
菜系
川菜    60   80
鲁菜    40   50
粤菜    30   20

💡 观察:这张透视表以 "菜系" 为行、"时段" 为列,交叉格子是销量。一眼看出:川菜晚餐卖得最好 (80)、粤菜晚餐最低 (20)。这就是透视表的直观优势。

🧠 思考题

  1. 透视表的 "行、列、值、聚合方式" 分别由哪 4 个参数控制?
  2. 透视表和 groupby 分组统计的结果有什么异同?什么场景用透视表更合适?
‹ 返回目录
🏠首页 Python 📦资源 👤关于我