
本文介绍使用 pandas 的 melt + pivot 组合操作,将原始 DataFrame 的列名(如 "Movie 1", "Movie 2")转化为新列的值,并按原单元格内容(如 "1st choice", "2nd choice")重新组织行列结构,实现行列角色对调。
本文介绍使用 pandas 的 `melt` + `pivot` 组合操作,将原始 dataframe 的列名(如 "movie 1", "movie 2")转化为新列的值,并按原单元格内容(如 "1st choice", "2nd choice")重新组织行列结构,实现行列角色对调。
在数据分析中,常需对 DataFrame 进行“行列转置式”的结构重组——但不同于简单的 .T 转置(它仅交换行列索引),本例要求:原列名变为数据值,原单元格值变为新列名。这本质上是一次“值驱动的透视重构”,核心思路是:先将宽表“拉长”(melt),再以原单元格值为新列名进行“聚拢”(pivot)。
以下为推荐的简洁写法:
import pandas as pd
# 构造原始 DataFrame
df = pd.DataFrame({
'Movie 1': ['1st choice', '2nd choice'],
'Movie 2': ['2nd choice', '1st choice']
})
# 执行重组织:列名 → 值,原值 → 新列名
out = (df.melt(ignore_index=False)
.pivot(columns='value', values='variable')
.rename_axis(index=None, columns=None))
输出结果为:
1st choice 2nd choice 0 Movie 1 Movie 2 1 Movie 2 Movie 1
✅ 关键说明:
- melt(ignore_index=False) 保留原始行索引(避免打乱顺序),生成三列:variable(原列名)、value(原单元格值)、variable 对应的值(即列名本身);
- pivot(columns='value', values='variable') 将 value 列唯一值作为新列名,variable 列作为填充值,自动按原索引对齐行;
- rename_axis(...) 可选,用于清除默认的轴名称(如 value 列名残留),使结果更干净。
⚠️ 注意事项:
- 若原 DataFrame 行索引非数字或存在重复,建议改用更稳健的显式索引方式(如第二个示例中的 reset_index().melt('index'));
- pivot 要求 (index, columns) 组合唯一,若存在重复组合(如同一行中出现两次 "1st choice"),需改用 pivot_table 并指定聚合函数(如 aggfunc='first');
- 列值(如 "1st choice")必须可哈希且无歧义;若含空格或特殊字符,pivot 仍能正常处理,但后续访问列时需使用方括号(如 out['1st choice'])。
该方法高效、可读性强,是 pandas 中处理此类“语义转置”任务的标准范式。










