如何重新组织Pandas DataFrame实现列名与列值互换?
解决DataFrame列名与列值互换的重塑问题
原始DataFrame:
| Movie 1 | Movie 2 |
|---|---|
| 1st choice | 2nd choice |
| 2nd choice | 1st choice |
目标DataFrame:
| 1st Choice | 2nd Choice |
|---|---|
| Movie 1 | Movie 2 |
| Movie 2 | Movie 1 |
这里需要把**电影名(原列名)和选择标签(原列值)**的对应关系反转,以下两种方法可以实现:
方法一:用melt+pivot分步处理(清晰易懂)
先构造原始数据:
import pandas as pd df = pd.DataFrame({ 'Movie 1': ['1st choice', '2nd choice'], 'Movie 2': ['2nd choice', '1st choice'] })
执行重塑操作:
# 给每行添加唯一标识,避免pivot时合并数据 df['row_id'] = df.index # 把宽表转成长格式,拆分电影名和对应的选择标签 melted_df = df.melt(id_vars='row_id', var_name='movie_name', value_name='choice_label') # 转成目标宽格式,以选择标签为列名,电影名为值 target_df = melted_df.pivot( index='row_id', columns='choice_label', values='movie_name' ).reset_index(drop=True) # 调整列名的大小写,匹配目标格式 target_df.columns = target_df.columns.str.title()
步骤解释:
- 加
row_id是为了区分不同行的选择,否则pivot会把所有行的结果合并成一行 melt把原表的每一列(电影名)拆成独立行,让每个电影名和它对应的选择标签一一对应pivot把选择标签转成列,每个row_id对应的电影名填充到对应列下- 最后重置索引去掉
row_id,并把列名改成首字母大写的格式
方法二:用apply一行搞定(简洁高效)
如果追求代码简洁,可以直接对每行做映射转换:
import pandas as pd df = pd.DataFrame({ 'Movie 1': ['1st choice', '2nd choice'], 'Movie 2': ['2nd choice', '1st choice'] }) # 对每行构建"选择标签: 电影名"的字典,再转成DataFrame target_df = df.apply( lambda row: {label.title(): movie for movie, label in row.items()}, axis=1 ).apply(pd.Series)
这个方法的逻辑是:遍历每行的列名(电影名)和对应值(选择标签),反转映射关系后生成字典,再把这些字典转换成DataFrame,自动对齐列名。
内容的提问来源于stack exchange,提问作者TylerTheTorch
相关产品推荐
相关产品推荐

