如何按双条件合并DataFrame:适配全国与城市级假日数据
问题:合并假日数据集时的多条件匹配问题
我正在学习时间序列分析,处理Store Sales时间序列预测竞赛的数据集,已完成其他数据合并,但在合并holidays_events数据集时遇到问题。
当前merged_df的前几行数据:
id date store_nbr family sales onpromotion dcoilwtico city state type cluster transactions 0 2013-01-01 1 AUTOMOTIVE 0.0 0 NaN Quito Pichincha D 13 NaN 1 2013-01-01 1 BABY CARE 0.0 0 NaN Quito Pichincha D 13 NaN 2 2013-01-01 1 BEAUTY 0.0 0 NaN Quito Pichincha D 13 NaN 3 2013-01-01 1 BEVERAGES 0.0 0 NaN Quito Pichincha D 13 NaN 4 2013-01-01 1 BOOKS 0.0 0 NaN Quito Pichincha D 13 NaN
holidays_events的前几行数据:
date type locale locale_name description transferred 2012-03-02 Holiday Local Manta Fundacion de Manta False 2012-04-01 Holiday Regional Cotopaxi Provincializacion de Cotopaxi False 2012-04-12 Holiday Local Cuenca Fundacion de Cuenca False 2012-04-14 Holiday Local Libertad Cantonizacion de Libertad False 2012-04-21 Holiday Local Riobamba Cantonizacion de Riobamba False
其中holidays_events的locale_name字段包含城市名称(对应特定城市假日)和Ecuador(全国性假日,适用于所有城市)。我尝试了以下代码,但产生大量重复列:
ecuador = holidays_events.loc[holidays_events["locale_name"] == "Ecuador"].copy() nonecuador = holidays_events.loc[holidays_events["locale_name"] != "Ecuador"].copy() merged_df = merged_df.merge(nonecuador, left_on=['date', 'city'], right_on=['date', 'locale_name'], how='left') merged_df = merged_df.merge(ecuador, on='date', how='left')
请问如何实现:locale_name为Ecuador的行按date匹配,其他行按date和city匹配的合并逻辑?
解决方案
核心思路是拆分假日数据分别匹配,再合并重复列,优先保留城市级假日信息,缺失部分用全国假日填充:
拆分并预处理假日数据
# 分离全国假日,移除不需要的locale_name列 national_holidays = holidays_events[holidays_events['locale_name'] == 'Ecuador'].drop(columns=['locale_name']) # 城市假日重命名locale_name为city,方便直接按date+city匹配 city_holidays = holidays_events[holidays_events['locale_name'] != 'Ecuador'].rename(columns={'locale_name': 'city'})合并城市级假日
merged_df = merged_df.merge(city_holidays, on=['date', 'city'], how='left')合并全国假日并填充缺失值
给全国假日的列添加后缀避免冲突,再用combine_first填充城市假日未覆盖的记录:# 给全国假日列加后缀,防止列名重复 national_holidays_renamed = national_holidays.add_suffix('_national') merged_df = merged_df.merge(national_holidays_renamed, on='date', how='left') # 合并重复列:优先用城市假日的值,无值则取全国假日 for col in ['type', 'locale', 'description', 'transferred']: merged_df[col] = merged_df[col].combine_first(merged_df[f'{col}_national']) # 删除临时的后缀列 merged_df = merged_df.drop(columns=[col for col in merged_df.columns if '_national' in col])
补充说明
- 确保
date列在两个数据集中都是datetime类型,避免格式不匹配导致的匹配失败 - 该方法不会产生重复列,同时保证全国假日对所有城市生效、城市假日仅对对应城市生效的逻辑
内容的提问来源于stack exchange,提问作者dez8686
相关产品推荐
相关产品推荐

