Python DataFrame多匹配合并:如何关联天气与主机数据?
实现两个DataFrame的多匹配合并
完全可以通过pandas的merge()函数实现你需要的匹配需求,核心是基于**date和ZipCode两个字段**进行关联,将天气数据匹配到对应的每条主机记录上。
步骤示例:
- 导入pandas并构造示例DataFrame:
import pandas as pd # 构造df1:天气数据 df1 = pd.DataFrame({ 'date': ['2022-11-25 00:00:00', '2022-11-25 00:00:15', '2022-11-25 00:00:30'], 'ZipCode': [123456, 123456, 123456], 'Weather': [34, 35, 36] }) # 构造df2:主机数据 df2 = pd.DataFrame({ 'date': ['2022-11-25 00:00:00', '2022-11-25 00:00:00', '2022-11-25 00:00:00', '2022-11-25 00:00:15', '2022-11-25 00:00:30', '2022-11-25 00:00:30'], 'ZipCode': [123456, 123456, 123456, 123456, 123456, 123456], 'host': ['host1', 'host2', 'host3', 'host1', 'host2', 'host3'] }) # 可选:将date字段转为datetime类型,避免字符串格式不一致导致匹配失败 df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date'])
- 执行合并操作:
# 基于date和ZipCode关联,保留df2所有记录并匹配对应天气数据 merged_df = pd.merge(df2, df1, on=['date', 'ZipCode'], how='left')
- 查看合并结果:
print(merged_df)
输出结果与你期望的一致:
date ZipCode host Weather 0 2022-11-25 00:00:00 123456 host1 34 1 2022-11-25 00:00:00 123456 host2 34 2 2022-11-25 00:00:00 123456 host3 34 3 2022-11-25 00:00:15 123456 host1 35 4 2022-11-25 00:00:30 123456 host2 36 5 2022-11-25 00:00:30 123456 host3 36
关键说明:
on=['date', 'ZipCode']:指定双关联字段,确保只有同一时间、同一邮编的记录才会匹配how='left':保留df2的所有记录,若df1中无对应数据则Weather字段会显示NaN;如果你的场景中df2的所有date/ZipCode组合都存在于df1,使用how='inner'也可得到相同结果- 提前转换
date为datetime类型,能避免不同字符串格式(如带时区、不同分隔符)导致的匹配异常
内容的提问来源于stack exchange,提问作者Francisco Hernandez
相关产品推荐
相关产品推荐

