You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新组织Pandas DataFrame实现列名与列值互换?

解决DataFrame列名与列值互换的重塑问题

原始DataFrame:

Movie 1Movie 2
1st choice2nd choice
2nd choice1st choice

目标DataFrame:

1st Choice2nd Choice
Movie 1Movie 2
Movie 2Movie 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:07:36