Python Pandas:利用另一DataFrame的匹配值重命名列
解决方案
核心思路
利用df1的索引与Size rating列构建学校名称-规模等级的映射字典,再通过pandas.DataFrame.rename()方法批量替换df2中的学校名列名,同时保留datetime列不变。
实现代码
1. 构造示例数据(模拟你的场景)
import pandas as pd # 构建df1 df1_data = { 'Yearly energy consumption': [322149.32, 383479.07, 296916.41, 84884.86, 463568.63, 177668.37], 'Size rating': ['Medium school', 'Medium school', 'Medium school', 'Small school', 'Large school', 'Small school'] } df1 = pd.DataFrame(df1_data, index=['Almtunaskolan', 'Almunge skola', 'Bergaskolan (Videskolan)', 'Danmarks skola', 'Domarringens skola', 'Ekuddens skola']) # 构建df2 df2_data = { 'datetime': pd.date_range('2017-01-02 00:00:00', periods=5, freq='H'), 'Almtunaskolan': [0.001268, 0.001257, 0.001257, 0.001257, 0.001268], 'Almunge skola': [0.000579, 0.000591, 0.000583, 0.000587, 0.000583], 'Danmarks skola': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005] } df2 = pd.DataFrame(df2_data)
2. 执行重命名操作
# 生成学校名称到规模等级的映射字典 school_size_map = df1['Size rating'].to_dict() # 批量替换列名:匹配到的学校名替换为对应规模,未匹配的列(如datetime)保留原名称 df2.rename(columns=lambda col: school_size_map.get(col, col), inplace=True)
3. 最终结果
运行后df2的列名会变为:
datetime Medium school Medium school Small school 0 2017-01-02 00:00:00 0.001268 0.000579 0.00010 1 2017-01-02 01:00:00 0.001257 0.000591 0.00020 2 2017-01-02 02:00:00 0.001257 0.000583 0.00030 3 2017-01-02 03:00:00 0.001257 0.000587 0.00040 4 2017-01-02 04:00:00 0.001268 0.000583 0.00050
常见失败原因排查
- 未处理
datetime列:如果直接用字典映射所有列,会因datetime不在字典中报错,用lambda结合dict.get()可自动保留非学校名称的列。 - 索引/列名不匹配:需确保
df1的索引与df2的学校名列名是完全一致的字符串(无多余空格、大小写差异),你已确认所有df2列名都在df1索引中,此问题可排除。 - 未启用
inplace=True:若未设置该参数,rename()会返回新DataFrame,原df2不会被修改。
内容的提问来源于stack exchange,提问作者Calle Flygare
相关产品推荐
相关产品推荐

