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,提问作者Дмитрий Баженов
相关产品推荐
相关产品推荐

