Python 3 中 melt 的逆操作是 pivot 和 pivot_table:pivot 要求 index+columns 组合唯一,否则报错;pivot_table 支持聚合解决重复问题;unstack 功能类似但更底层、易出 MultiIndex。

直接说结论:Python 3 中没有 melt 的“逆向函数”叫 unmelt,但 pandas 提供了标准解法:pivot 和 pivot_table —— 它们才是 melt 的真正逆操作,选哪个取决于你的数据是否满足唯一性约束。
什么时候用 pivot?数据必须满足“索引+列组合唯一”
pivot 是最干净的 melt 逆操作,但它要求:对任意一组 index 和 columns 值,values 列只能有一个对应值。否则会报错:ValueError: Index contains duplicate entries, cannot reshape。
常见适用场景:实验记录(每个 subject × time 只有一条测量)、用户-商品评分(每个 user × item 最多一条评分)。
- 语法:
df.pivot(index='id', columns='variable', values='value') - 结果默认不保留原始列名层级,若需还原列名前缀,加
.add_prefix('col_') - 如果
values是数值型但含缺失,pivot会自动填NaN,不报错
为什么突然报错“duplicate entries”?该切到 pivot_table
只要同一组 index + columns 出现多条 values 记录,pivot 就失败——这不是 bug,是设计使然。这时必须改用 pivot_table,它本质是带聚合的透视。
立即学习“Python免费学习笔记(深入)”;
典型踩坑场景:日志数据(同一个 user_id × event_type 可能有多个 timestamp)、传感器采样(同一 device × metric 在一秒内多次上报)。
- 基础写法:
df.pivot_table(index='user_id', columns='event', values='ts', aggfunc='first') -
aggfunc可选'mean'、'count'、lambda x: x.iloc[-1]等,按需选;不指定则默认用'mean' - 注意:
pivot_table默认会把columns变成列索引(MultiIndex),加fill_value=0可替换 NaN
set_index + unstack 和 pivot 有什么区别?
功能上高度重合,但行为细节不同:unstack 更底层、更灵活,也更容易意外炸出 MultiIndex 列。
当你已经用 melt 得到三列(如 id, variable, value),想转宽表时,unstack 要求先设好索引:
- 正确链式写法:
df.set_index(['id', 'variable'])['value'].unstack('variable') - 漏掉
['value']会返回 DataFrame,unstack后列变成二级索引,处理起来反而麻烦 - 如果
variable有重复值,unstack同样报错,且错误信息不如pivot直观
实际项目里,优先写 pivot 或 pivot_table。它们语义明确、容错提示友好,而 unstack 更适合在已有分层索引结构上做微调。宽格式转换真正的难点不在函数选择,而在确认原始长表中“哪些字段构成唯一键”——这个逻辑错一点,后面全错。


















