Python:如何将df2温度数据匹配合并至df1对应城市与月份?
解决方案
以下提供两种实用方法实现需求,先构造示例数据方便你直接测试验证:
示例数据构造
import pandas as pd # df1:包含州、城市、日期记录 df1 = pd.DataFrame({ 'State': ['SP', 'RJ', 'MG', 'SP'], 'City': ['Sao Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'Campinas'], 'Dates': pd.to_datetime(['2023-03-15', '2023-04-20', '2023-05-10', '2023-03-05']) }) # df2:对应城市的3/4/5月平均气温数据 df2 = pd.DataFrame({ 'City': ['Sao Paulo', 'Rio de Janeiro', 'Belo Horizonte'], 'MAR': [25.5, 27.2, 24.8], 'APR': [23.1, 25.6, 22.9], 'MAY': [20.8, 23.3, 20.5] })
方法1:合并后用lookup匹配气温
步骤直观,适合中小型数据集:
- 内连接合并两表:仅保留两表中匹配的城市
merged_df = pd.merge(df1, df2, on='City', how='inner')
- 提取日期对应的月份缩写:转大写以匹配df2的列名(MAR/APR/MAY)
merged_df['Month'] = merged_df['Dates'].dt.strftime('%b').upper()
- 匹配对应月份气温:用
lookup快速定位列值生成Temp列
merged_df['Temp'] = merged_df.lookup(merged_df.index, merged_df['Month']) # 清理冗余列(可选操作) final_df = merged_df.drop(['MAR', 'APR', 'MAY', 'Month'], axis=1)
方法2:将df2转长格式后合并
灵活性更强,适合大型数据集或需扩展到更多月份的场景:
- 将df2转为长格式:把月份列拆成行数据
df2_melted = df2.melt(id_vars='City', var_name='Month', value_name='Temp')
- 匹配城市与月份合并:直接关联df1的城市和提取的月份缩写
merged_df = pd.merge( df1, df2_melted, left_on=['City', df1['Dates'].dt.strftime('%b').upper()], right_on=['City', 'Month'], how='inner' ).drop('Month', axis=1)
关键注意事项
- 确保
df1['Dates']是datetime类型,若不是先做转换:df1['Dates'] = pd.to_datetime(df1['Dates']) - 若存在同市不同州的重复城市,合并时需同时匹配
State和City,即把on='City'改为on=['State','City']
内容的提问来源于stack exchange,提问作者MCly
相关产品推荐
相关产品推荐

