我们用最生活化、最通俗易懂的方式,向初学者讲清楚:
🧩 Pandas 的 pivot_table 数据透视表 —— 一学就会!
💡 一句话理解:
pivot_table就是“把数据像 Excel 透视表那样重新整理+汇总”,让你一眼看清规律!
🎯 一、为什么需要 pivot_table?
想象你有一张“销售记录表”,包含:
- 日期
- 城市
- 产品
- 销售额
你想知道:
✅ “每个城市每种产品的总销售额是多少?”
✅ “哪个产品在哪个城市卖得最好?”
✅ “平均每个销售员卖了多少?”
—— 这时候,你就需要 数据透视表(pivot_table)!
📊 二、举个生活化例子 🍎🍌🍇
我们用一个水果销售表来演示:
import pandas as pd
df = pd.DataFrame({
'城市': ['北京', '上海', '北京', '上海', '北京', '上海'],
'水果': ['苹果', '苹果', '香蕉', '香蕉', '苹果', '葡萄'],
'销量': [10, 15, 8, 12, 5, 20],
'价格': [5, 6, 3, 4, 5, 8]
})
📊 原始数据:
| 城市 | 水果 | 销量 | 价格 | |
|---|---|---|---|---|
| 0 | 北京 | 苹果 | 10 | 5 |
| 1 | 上海 | 苹果 | 15 | 6 |
| 2 | 北京 | 香蕉 | 8 | 3 |
| 3 | 上海 | 香蕉 | 12 | 4 |
| 4 | 北京 | 苹果 | 5 | 5 |
| 5 | 上海 | 葡萄 | 20 | 8 |
🧱 三、pivot_table 四大核心参数 —— 记住这4个就够了!
pd.pivot_table(
data=, # 数据源 DataFrame
index=, # 行:你想“按什么分组”(比如城市)
columns=, # 列:你想“展开成列的是什么”(比如水果)
values=, # 值:你想“计算什么”(比如销量)
aggfunc= # 计算方式:求和?平均?计数?(默认是 mean)
)
✅ 四、实战案例1:每个城市 × 每种水果 → 总销量
table = pd.pivot_table(
data=df,
index='城市', # 行:城市
columns='水果', # 列:水果
values='销量', # 值:销量
aggfunc='sum' # 计算方式:求和
)
print(table)
📌 输出:
水果 苹果 香蕉 葡萄
城市
北京 15 8 NaN
上海 15 12 20.0
👉 一眼看出:
- 北京苹果卖了 15,香蕉 8,葡萄没卖(NaN)
- 上海葡萄卖最多!
✅ 五、实战案例2:想看平均价格?
table = pd.pivot_table(
data=df,
index='城市',
columns='水果',
values='价格',
aggfunc='mean' # 默认就是 mean,可省略
)
📌 输出:
水果 苹果 香蕉 葡萄
城市
北京 5.0 3.0 NaN
上海 6.0 4.0 8.0
✅ 六、实战案例3:同时看“销量总和”和“价格平均值”
table = pd.pivot_table(
data=df,
index='城市',
columns='水果',
values=['销量', '价格'], # 传入列表,看多个指标
aggfunc={'销量': 'sum', '价格': 'mean'} # 分别指定计算方式
)
📌 输出(层次化列名):
销量 价格
水果 苹果 香蕉 葡萄 苹果 香蕉 葡萄
城市
北京 15 8 NaN 5.0 3.0 NaN
上海 15 12 20.0 6.0 4.0 8.0
🧰 七、常用 aggfunc(聚合函数)有哪些?
| 函数名 | 作用 | 示例 |
|---|---|---|
'sum' | 求和 | 总销售额 |
'mean' | 平均值 | 平均单价 |
'count' | 计数 | 交易笔数 |
'max' | 最大值 | 最高销量 |
'min' | 最小值 | 最低价格 |
'std' | 标准差 | 波动分析 |
len | 行数(含NaN) | |
lambda x: x.sum() - x.mean() | 自定义函数 | 灵活计算 |
🧹 八、处理缺失值 NaN
默认透视表会保留 NaN。你可以:
✅ 用 fill_value 填充缺失值
table = pd.pivot_table(df, index='城市', columns='水果', values='销量',
aggfunc='sum', fill_value=0)
📌 输出:
水果 苹果 香蕉 葡萄
城市
北京 15 8 0
上海 15 12 20
🔄 九、想“调换行列”?很简单!
只需交换 index 和 columns:
# 原来:城市是行,水果是列
pd.pivot_table(df, index='城市', columns='水果', values='销量', aggfunc='sum')
# 现在:水果是行,城市是列
pd.pivot_table(df, index='水果', columns='城市', values='销量', aggfunc='sum')
📌 输出:
城市 北京 上海
水果
苹果 15 15
香蕉 8 12
葡萄 NaN 20
📈 十、配合 .plot() 直接画图!
透视表是 DataFrame,可以直接画图:
table = pd.pivot_table(df, index='城市', columns='水果', values='销量', aggfunc='sum', fill_value=0)
table.plot(kind='bar', stacked=True)
→ 一键生成分组柱状图!📊
⚠️ 十一、初学者常见错误 & 解决方案
❌ 错误1:ValueError: Index contains duplicate entries, cannot reshape
→ 说明你的 index + columns 组合有重复!
✅ 解决:加 aggfunc 告诉 Pandas 怎么合并重复项(比如 sum, mean)
❌ 错误2:结果全是 NaN
→ 可能是 values 列名写错了,或数据类型不对(比如文本不能 sum)
✅ 解决:检查列名、数据类型
❌ 错误3:想透视的列是 object 类型但其实是数字
→ 先转换类型:df['销量'] = pd.to_numeric(df['销量'], errors='coerce')
📌 十二、终极记忆口诀
🧭 “行是什么?列是什么?值算什么?怎么算?”
index= 行(分组依据)columns= 列(展开成列的分类)values= 值(你要统计的数字列)aggfunc= 怎么算(sum / mean / count...)
✅ 十三、真实应用场景举例
| 场景 | index | columns | values | aggfunc |
|---|---|---|---|---|
| 各地区各产品销售额 | 地区 | 产品 | 销售额 | sum |
| 各班级各科目平均分 | 班级 | 科目 | 分数 | mean |
| 各月份各销售员订单数 | 月份 | 销售员 | 订单ID | count |
| 各城市各年份最高气温 | 城市 | 年份 | 温度 | max |
🎁 Bonus:和 Excel 透视表对照
| Excel 透视表 | Pandas pivot_table |
|---|---|
| “行”字段 | index= |
| “列”字段 | columns= |
| “值”字段 | values= |
| “值字段设置” | aggfunc= |
| “分类汇总” | 多层 index/columns |
| “空白单元格显示为0” | fill_value=0 |
✅ 总结:一张图记住 pivot_table
pd.pivot_table(
data = 你的数据表,
index = '行分组字段', ← 比如“城市”
columns = '列展开字段', ← 比如“水果”
values = '数值字段', ← 比如“销量”
aggfunc = 'sum', ← 怎么计算:sum / mean / count...
fill_value = 0 ← 缺失值填0
)
🎯 现在你已经完全掌握 pivot_table 了!
下次老板说“给我一个按地区和产品分类的销售汇总”,你 10 秒就能搞定!