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

如何按双条件合并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匹配的合并逻辑?


解决方案

核心思路是拆分假日数据分别匹配,再合并重复列,优先保留城市级假日信息,缺失部分用全国假日填充:

  1. 拆分并预处理假日数据

    # 分离全国假日,移除不需要的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'})
    
  2. 合并城市级假日

    merged_df = merged_df.merge(city_holidays, on=['date', 'city'], how='left')
    
  3. 合并全国假日并填充缺失值
    给全国假日的列添加后缀避免冲突,再用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:17:23