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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:33:15