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

如何依据另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:29