Skip to content

Pandas Pivot vs Melt:正确的重塑方式

Updated on

重塑数据往往是分析/可视化前的瓶颈。方法选错会导致行重复、数据丢失,或生成难用的超宽表。

PAS 视角:

  • 问题: 混乱的 wide/long 数据拖慢绘图和聚合。
  • 激化: 有重复还用 pivot 会报错;melt 用不好会成倍增加行或丢掉标识。
  • 解决: 遵循 tidy 流程——有重复就 pivot_table,键唯一可用 pivot,去 long 用 melt,MultiIndex 用 stack/unstack 微调。

快速指南

方法方向何时使用处理重复?
pivotlong → wide键唯一🚫(重复报错)
pivot_tablelong → wide需要聚合或存在重复✅ 通过 aggfunc
meltwide → long将列标准化为行N/A
stack / unstackwide ↔ long(索引层级)MultiIndexN/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) 指定层。

常见问题

问题解决
pivotIndex contains duplicate entries改用带聚合的 pivot_table
列顺序不符合预期排序列:table = table.reindex(sorted(table.columns), axis=1)
MultiIndex 难读pivot_table 后扁平化列。
重塑后缺失值增多fill_valuestack(dropna=False) 保留空格。

工作流提示

  • 先标准化:meltgroupby/aggpivot_table 做展示。
  • 做图时保持长表;宽表更适合报告/导出。
  • pivot_table 之后可直接导出:table.to_excel("report.xlsx")

相关指南


关键要点

  • 键唯一用 pivot,重复/需聚合用 pivot_table,转长用 melt
  • 复杂 pivot 后扁平化 MultiIndex,导出更干净。
  • 将重塑与 groupby 结合,快速得到可分析的数据集。