Pandas技巧:pivot_table 数据透视表

144 阅读4分钟

我们用最生活化、最通俗易懂的方式,向初学者讲清楚:


🧩 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北京苹果105
1上海苹果156
2北京香蕉83
3上海香蕉124
4北京苹果55
5上海葡萄208

🧱 三、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

🔄 九、想“调换行列”?很简单!

只需交换 indexcolumns

# 原来:城市是行,水果是列
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...)

✅ 十三、真实应用场景举例

场景indexcolumnsvaluesaggfunc
各地区各产品销售额地区产品销售额sum
各班级各科目平均分班级科目分数mean
各月份各销售员订单数月份销售员订单IDcount
各城市各年份最高气温城市年份温度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 秒就能搞定!