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

如何通过字典映射重命名DataFrame列,无匹配时保留原列名?

解决Pandas列名映射时保留未匹配原列名的问题

原始数据与映射表

首先定义原始数据框:

import pandas as pd

dfData = pd.DataFrame({
    'A1':['1','2'],
    'B1':['1','2'],
    'C1':['1','2'],
    'D1':['1','2']
})

输出:

A1B1C1D1
1111
2222

定义列名映射表:

dfMap = pd.DataFrame({
    'dfDataCol':['A1','B1','C1',''],
    'NewCol'   :['A2','B2','C2','D2']
})

输出:

dfDataColNewCol
A1A2
B1B2
C1C2
D2

原方法问题

原代码将映射表转为字典后用map处理列名,未匹配的列名会变成NaN:

dict1 = dfMap.set_index('dfDataCol').to_dict()['NewCol']
dfData.columns = dfData.columns.map(dict1)

输出结果:

A2B2C2NaN
1111
2222

解决方案

方法1:使用columns.replace()

replace方法会自动保留未匹配的列名,同时先过滤掉映射表中空的无效键:

# 过滤映射表中空的dfDataCol行,转为字典
dict1 = dfMap[dfMap['dfDataCol'] != ''].set_index('dfDataCol')['NewCol'].to_dict()
# 替换列名
dfData.columns = dfData.columns.replace(dict1)

方法2:map结合dict.get()

利用字典的get方法,指定未找到键时返回原列名:

dict1 = dfMap[dfMap['dfDataCol'] != ''].set_index('dfDataCol')['NewCol'].to_dict()
# 用lambda函数处理,匹配不到则返回原列名
dfData.columns = dfData.columns.map(lambda col: dict1.get(col, col))

最终结果

两种方法都能得到期望的输出:

A2B2C2D1
1111
2222

内容的提问来源于stack exchange,提问作者Laucrimus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:40:31