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

Pandas合并DataFrame:如何保留df_sales原行数并关联假期信息?

解决左连接后行数减少的问题

先排查核心原因

  • 检查date列的数据类型是否一致:
    print(df_sales['date'].dtype, holidays_df['date'].dtype)
    
  • 检查df_sales中date列的缺失值数量:
    print(df_sales['date'].isna().sum())
    
  • 确认合并前后的行数:
    print("原销售数据行数:", len(df_sales))
    merged_df = df_sales.merge(holidays_df, on='date', how='left')
    print("合并后行数:", len(merged_df))
    

可靠的解决方案

方案1:用map直接映射(推荐)

这种方法完全保证保留原数据行数,无匹配日期自动填充NaN:

# 将节假日表转为日期到标识的字典
holiday_dict = holidays_df.set_index('date')['is_holiday'].to_dict()
# 给销售数据添加休息日标识列
df_sales['is_holiday'] = df_sales['date'].map(holiday_dict)

方案2:修复合并问题

如果坚持用merge,先统一日期格式和类型:

# 统一转为datetime类型
df_sales['date'] = pd.to_datetime(df_sales['date'], errors='coerce')
holidays_df['date'] = pd.to_datetime(holidays_df['date'], errors='coerce')
# 执行左连接
merged_df = df_sales.merge(holidays_df, on='date', how='left')

如果存在隐形格式差异(如带时区、空格),可以转为字符串后合并:

# 转为字符串格式
df_sales['date_str'] = df_sales['date'].dt.strftime('%Y-%m-%d')
holidays_df['date_str'] = holidays_df['date'].dt.strftime('%Y-%m-%d')
# 按字符串日期合并,之后删除临时列
merged_df = df_sales.merge(holidays_df, on='date_str', how='left').drop('date_str', axis=1)

关键提示

左连接理论上不会减少左表行数,出现行数减少大概率是:

  • date列存在无法匹配的隐形格式问题
  • 合并后误执行了dropna()或其他过滤操作
  • 原df_sales中存在重复行,合并后被意外去重(但这种情况行数通常会增加)

内容的提问来源于stack exchange,提问作者Дмитрий Баженов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:52:54