Pandas Pivot vs Melt:正确的重塑方式
Updated on
重塑数据往往是分析/可视化前的瓶颈。方法选错会导致行重复、数据丢失,或生成难用的超宽表。
PAS 视角:
- 问题: 混乱的 wide/long 数据拖慢绘图和聚合。
- 激化: 有重复还用
pivot会报错;melt用不好会成倍增加行或丢掉标识。 - 解决: 遵循 tidy 流程——有重复就
pivot_table,键唯一可用pivot,去 long 用melt,MultiIndex 用stack/unstack微调。
快速指南
| 方法 | 方向 | 何时使用 | 处理重复? |
|---|---|---|---|
pivot | long → wide | 键唯一 | 🚫(重复报错) |
pivot_table | long → wide | 需要聚合或存在重复 | ✅ 通过 aggfunc |
melt | wide → long | 将列标准化为行 | N/A |
stack / unstack | wide ↔ long(索引层级) | MultiIndex | N/A |
示例数据
import pandas as pd
sales = pd.DataFrame({
"region": ["NA", "NA", "EU", "EU"],
"quarter": ["Q1", "Q2", "Q1", "Q2"],
"product": ["A", "A", "A", "A"],
"revenue": [120, 140, 110, 150],
"units": [10, 11, 9, 12],
})用 pivot 生成宽表
wide = sales.pivot(index="region", columns="quarter", values="revenue")- 需保证
region+quarter组合唯一。 - 需要时可
.reset_index()扁平化。
带聚合的宽表 (pivot_table)
table = sales.pivot_table(
index="region",
columns="quarter",
values="revenue",
aggfunc="sum",
margins=True,
margins_name="Total"
)- 遇到重复会自动聚合。
fill_value=0便于导出。
多值与多聚合
multi = sales.pivot_table(
index="region",
columns="quarter",
values=["revenue", "units"],
aggfunc={"revenue": "sum", "units": "mean"},
)扁平化列:
multi.columns = [f"{metric}_{col}" for metric, col in multi.columns]
multi = multi.reset_index()用 melt 转为长表
long = sales.melt(
id_vars=["region", "quarter"],
value_vars=["revenue", "units"],
var_name="metric",
value_name="value",
)- 适合期望 tidy 数据的可视化库。
- 用
value_vars控制要展开的列。
面向 MultiIndex 的 stack/unstack
stacked = table.stack()
unstacked = stacked.unstack()- 无需重定义键即可调整层级。
- 用
stack(level="quarter")或unstack(level=-1)指定层。
常见问题
| 问题 | 解决 |
|---|---|
pivot 报 Index contains duplicate entries | 改用带聚合的 pivot_table。 |
| 列顺序不符合预期 | 排序列:table = table.reindex(sorted(table.columns), axis=1)。 |
| MultiIndex 难读 | pivot_table 后扁平化列。 |
| 重塑后缺失值增多 | 用 fill_value 或 stack(dropna=False) 保留空格。 |
工作流提示
- 先标准化:
melt→groupby/agg→pivot_table做展示。 - 做图时保持长表;宽表更适合报告/导出。
pivot_table之后可直接导出:table.to_excel("report.xlsx")。
相关指南
关键要点
- 键唯一用
pivot,重复/需聚合用pivot_table,转长用melt。 - 复杂 pivot 后扁平化 MultiIndex,导出更干净。
- 将重塑与
groupby结合,快速得到可分析的数据集。