如何通过字典映射重命名DataFrame列,无匹配时保留原列名?
解决Pandas列名映射时保留未匹配原列名的问题
原始数据与映射表
首先定义原始数据框:
import pandas as pd dfData = pd.DataFrame({ 'A1':['1','2'], 'B1':['1','2'], 'C1':['1','2'], 'D1':['1','2'] })
输出:
| A1 | B1 | C1 | D1 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
定义列名映射表:
dfMap = pd.DataFrame({ 'dfDataCol':['A1','B1','C1',''], 'NewCol' :['A2','B2','C2','D2'] })
输出:
| dfDataCol | NewCol |
|---|---|
| A1 | A2 |
| B1 | B2 |
| C1 | C2 |
| D2 |
原方法问题
原代码将映射表转为字典后用map处理列名,未匹配的列名会变成NaN:
dict1 = dfMap.set_index('dfDataCol').to_dict()['NewCol'] dfData.columns = dfData.columns.map(dict1)
输出结果:
| A2 | B2 | C2 | NaN |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
解决方案
方法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))
最终结果
两种方法都能得到期望的输出:
| A2 | B2 | C2 | D1 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
内容的提问来源于stack exchange,提问作者Laucrimus
相关产品推荐
相关产品推荐

