如何重构DataFrame,将标题与对应排名值进行映射转换
DataFrame行列转换与值映射实现方案
原DataFrame结构
import pandas as pd df = pd.DataFrame({ 'Name': ['Name1', 'Name2', 'Name3', 'Name4'], 'Rank1': ['Title1', 'Title3', 'Title2', 'Title4'], 'Rank2': ['Title3', 'Title2', 'Title5', 'Title6'], 'Rank3': ['Title7', 'Title6', 'Title3', 'Title1'], 'Rank4': ['Title2', 'Title5', 'Title6', 'Title5'], 'Rank5': ['Title6', 'Title4', 'Title4', 'Title2'] })
目标DataFrame结构
Name Title1 Title2 Title3 Title4 Title5 Title6 Title7 0 Name1 1 4 2 10 10 5 3 1 Name2 10 2 1 4 4 3 10 2 Name3 10 1 3 5 2 4 10 3 Name4 3 5 10 1 4 2 10
实现代码
# 1. 将Rank列转为长格式,提取Rank数字作为对应分值 melted = df.melt(id_vars='Name', var_name='Rank', value_name='Title') melted['Score'] = melted['Rank'].str.extract('(\d+)').astype(int) # 2. 透视回宽格式,缺失值填充为10 pivoted = melted.pivot(index='Name', columns='Title', values='Score').fillna(10).reset_index() # 3. 按Title序号排序列,保证和目标结构一致 sorted_titles = sorted(pivoted.columns[1:], key=lambda x: int(x.split('Title')[1])) pivoted = pivoted[['Name'] + sorted_titles] # 移除透视生成的列名层级 pivoted.columns.name = None print(pivoted)
代码说明
- melt转换:把原表的Rank1-Rank5列拆成每行一个Name-Rank-Title的组合,同时从Rank字段里提取数字作为该Title对应的排名分值。
- 透视填充:将长格式数据转回宽表,以Name为索引、Title为列,没有出现过的Title用10填充。
- 列排序:按Title后缀的数字对列重新排序,确保输出列顺序和目标匹配。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

