承接《Pandas expanding / ewm 窗口详解》,本篇讲解
pivot_table透视表,和pivot做对比,包含基础用法、聚合函数、多维度、边距汇总、填充空值、分组筛选、多层透视、实战报表场景,是数据分析、业务汇总报表高频工具,保持系列教程统一风格。
前置导入与示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
"region": ["华东","华东","华南","华南","华北","华北","华东","华南"],
"cate": ["手机","电脑","手机","电脑","手机","电脑","手机","电脑"],
"sale_date": ["2025-01-01","2025-01-01","2025-01-02","2025-01-02","2025-01-03","2025-01-03","2025-01-03","2025-01-03"],
"sales": [1200, 800, 1500, 950, 1100, 780, 1350, 1020],
"profit": [180, 120, 220, 140, 160, 110, 195, 150]
})
print(df)
一、pivot_table 核心说明
pivot_table:数据透视表,类似Excel透视表。
- 自动分组 + 聚合,支持重复行合并统计
- 支持多索引、多列、多值、多种聚合函数
- 对比
pivot:pivot只做重塑,不支持聚合,重复键直接报错;pivot_table自带聚合,业务汇总优先用它。
基础语法:
pd.pivot_table(
data,
index=None, # 行维度
columns=None, # 列维度
values=None, # 需要统计的数值字段
aggfunc="mean", # 聚合函数
fill_value=None, # 缺失填充值
margins=False, # 是否开启合计行/列
margins_name="All" # 合计的名称
)
二、基础示例:单维度透视
按地区作为行,统计销售额均值
pt1 = pd.pivot_table(
df,
index="region",
values="sales",
aggfunc="mean"
)
print(pt1)
三、二维透视(行+列,最常用)
行:地区 region;列:品类 cate;值:sales,求和
pt2 = pd.pivot_table(
df,
index="region",
columns="cate",
values="sales",
aggfunc="sum"
)
print(pt2)
四、指定多个聚合函数
同时求总和、平均值、最大值
pt3 = pd.pivot_table(
df,
index="region",
columns="cate",
values="sales",
aggfunc=["sum", "mean", "max"]
)
print(pt3)
五、多个数值字段同时统计
sales 和 profit 一起汇总
pt4 = pd.pivot_table(
df,
index="region",
columns="cate",
values=["sales", "profit"],
aggfunc="sum"
)
print(pt4)
六、多行索引(多层行维度)
行维度:地区 + 日期,多层索引
pt5 = pd.pivot_table(
df,
index=["region", "sale_date"],
columns="cate",
values="sales",
aggfunc="sum"
)
print(pt5)
七、margins 开启合计行、合计列
margins=True 自动增加总计行、总计列
pt6 = pd.pivot_table(
df,
index="region",
columns="cate",
values="sales",
aggfunc="sum",
margins=True,
margins_name="合计"
)
print(pt6)
八、fill_value 填充透视产生的空值
维度组合没有数据时,默认NaN,fill_value填充
pt7 = pd.pivot_table(
df,
index="region",
columns="cate",
values="sales",
aggfunc="sum",
fill_value=0
)
print(pt7)
九、自定义聚合函数
aggfunc 可以传入自定义函数
def range_val(x):
return x.max() - x.min()
pt8 = pd.pivot_table(
df,
index="region",
columns="cate",
values="sales",
aggfunc=range_val
)
print(pt8)
十、pivot_table vs pivot 对比
| 函数 | 聚合 | 重复key | 适用场景 |
|---|---|---|---|
| pivot_table | ✅ 支持aggfunc | 自动聚合 | 业务报表、汇总统计(推荐) |
| pivot | ❌ 无聚合 | 重复值直接报错 | 数据规整、无重复的表格重塑 |
示例 pivot(仅重塑,不聚合)
# 仅适合组合唯一的场景
df.pivot(index="region", columns="cate", values="sales")
十一、透视表后常用操作
1. 重置索引,转为普通DataFrame(导出Excel常用)
pt = pd.pivot_table(df, index="region", columns="cate", values="sales", aggfunc="sum")
pt_reset = pt.reset_index()
2. 排序
pt.sort_values(by=("手机", "sum"), ascending=False)
3. 筛选维度
pt.loc["华东"]
pt["手机"]
十二、高频坑清单
- 原始数据存在重复 index+columns 组合,
pivot直接报错,改用pivot_table - margins合计是基于原始数据聚合,不是对透视出来的数字再求和,逻辑正确
- fill_value 只会填充透视后的NaN,不能处理原始数据缺失
- 多层行/列索引导出Excel可读性差,一般配合 reset_index 或者 flatten 表头
- aggfunc 多个函数时,会生成多层列索引,取值需要元组
pt[("sales","sum")] - 时间维度建议先转datetime,再放入index,方便后续排序筛选
十三、综合实战模板(导出报表模板)
def create_sale_pivot(df):
pt = pd.pivot_table(
df,
index="region",
columns="cate",
values=["sales","profit"],
aggfunc="sum",
fill_value=0,
margins=True,
margins_name="合计"
)
pt = pt.reset_index()
return pt
report = create_sale_pivot(df)
print(report)
# report.to_excel("pivot_report.xlsx")
十四、速查表
| 参数 | 作用 |
|---|---|
| index | 行分组维度 |
| columns | 列分组维度 |
| values | 需要统计的数值列 |
| aggfunc | 聚合函数 sum/mean/max/min/count |
| fill_value | 空白填充 |
| margins | 开启合计行、合计列 |
| margins_name | 合计标签名称 |
0 条笔记