如何利用另一个DataFrame的映射值重命名目标DataFrame的列?
如何修改DataFrame列名并保留原有数据(基于映射关系DataFrame)
这个需求很常见,我来给你一步步拆解解决方法,先从构造示例数据开始,这样你能直接跟着代码跑通整个流程:
第一步:构造示例DataFrame
首先我们先把你描述的两个DataFrame用代码还原出来:
import pandas as pd # 带原始数据的DataFrame,列名为name1、name2、name3 df_data = pd.DataFrame( [[123, 456, 678], [123, 456, 678]], # 两行示例数据,你可以换成自己的真实数据 columns=['name1', 'name2', 'name3'] ) # 存储列名映射关系的DataFrame,这里假设它有两列:原列名(original)和新列名(new) df_mapping = pd.DataFrame( {'original': ['name2', 'name3', 'name1'], 'new': ['abc', 'cdf', 'fgh']} )
第二步:两种修改列名的方法
方法一:用rename函数(推荐,不修改原数据)
先把映射DataFrame转换成原列名→新列名的字典,再用rename函数替换列名。这种方法不会改动原始的df_data,适合需要保留原数据的场景:
# 将映射DataFrame转为字典格式 col_map = df_mapping.set_index('original')['new'].to_dict() # 生成修改列名后的新DataFrame df_renamed = df_data.rename(columns=col_map) # 此时df_renamed的列名就是fgh、abc、cdf,和原数据的列顺序完全对应 print(df_renamed)
输出结果:
fgh abc cdf 0 123 456 678 1 123 456 678
方法二:直接赋值columns属性(更简洁,会修改原数据)
如果你不介意修改原始的df_data,可以直接构造目标列名列表并赋值给df_data.columns:
# 按照df_data原列名的顺序,从映射表中提取对应的新列名 new_col_names = df_mapping.set_index('original').loc[df_data.columns, 'new'].tolist() # 直接修改原DataFrame的列名 df_data.columns = new_col_names print(df_data)
输出结果和方法一完全一致。
注意点
- 如果你的映射DataFrame列名不是
original和new,记得把代码里的对应列名替换成你实际的列名; - 如果最终需要的列顺序和原DataFrame列顺序不同,修改完列名后可以用
df_final = df_renamed[['fgh', 'abc', 'cdf']]手动指定列顺序。
内容的提问来源于stack exchange,提问作者sundaysfantasy
相关产品推荐
相关产品推荐

