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

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匹配气温

步骤直观,适合中小型数据集:

  1. 内连接合并两表:仅保留两表中匹配的城市
merged_df = pd.merge(df1, df2, on='City', how='inner')
  1. 提取日期对应的月份缩写:转大写以匹配df2的列名(MAR/APR/MAY)
merged_df['Month'] = merged_df['Dates'].dt.strftime('%b').upper()
  1. 匹配对应月份气温:用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转长格式后合并

灵活性更强,适合大型数据集或需扩展到更多月份的场景:

  1. 将df2转为长格式:把月份列拆成行数据
df2_melted = df2.melt(id_vars='City', var_name='Month', value_name='Temp')
  1. 匹配城市与月份合并:直接关联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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:40:32