如何依据另一DataFrame的行匹配重命名DataFrame列名?
解决方法
先明确场景(示例可复现数据)
假设你的DataFrame结构如下(可根据实际情况调整):
import pandas as pd # df1:原始数据,列名为旧名称 df1 = pd.DataFrame({ 'A_old': [1, 2, 3], 'B_old': [4, 5, 6], 'C_old': [7, 8, 9], 'D_old': [10, 11, 12] }) # df2:存储新旧列名的映射关系(两种常见结构) # 结构1:两列分别存旧列名、新列名 df2 = pd.DataFrame({ 'old_col': ['B_old', 'A_old', 'D_old'], 'new_col': ['B_new', 'A_new', 'D_new'] }) # 结构2:df2是单行,列名为旧列名,值为对应新列名 # df2 = pd.DataFrame({ # 'A_old': ['A_new'], # 'B_old': ['B_new'], # 'D_old': ['D_new'] # })
核心解决步骤
不需要用pd.merge或pd.concat(这两个是用来合并数据行/列的,不适合列名映射场景),直接通过构建列名映射字典 + 筛选匹配列 + 重命名即可解决:
针对df2结构1的代码
# 1. 构建新旧列名的映射字典 col_mapping = dict(zip(df2['old_col'], df2['new_col'])) # 2. 筛选df1中与映射匹配的列,只保留相互匹配的部分 matched_cols = [col for col in df1.columns if col in col_mapping] df1_filtered = df1[matched_cols] # 3. 重命名列 df1_final = df1_filtered.rename(columns=col_mapping)
针对df2结构2的代码
如果df2是单行结构,直接提取该行转为字典即可:
# 提取df2的第一行作为映射字典 col_mapping = df2.iloc[0].to_dict() # 后续步骤和结构1一致 matched_cols = [col for col in df1.columns if col in col_mapping] df1_final = df1[matched_cols].rename(columns=col_mapping)
为什么之前的方法出错?
pd.merge/pd.concat是用于合并数据行或拼接列的工具,本质是处理数据内容的合并,不是用来做列名映射的,所以无法得到预期结果。- 追加df2行时出现重复索引错误,是因为追加操作没有重置索引,但这个操作本身就不是解决列名映射的正确路径,所以完全可以避开。
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

