Pandas DataFrame.merge未保留全部日期且未显示NaN问题咨询
解决Pandas Merge后丢失后续日期的问题
我来帮你排查并解决这个问题——你遇到的情况大概率是日期列的数据类型不匹配,或者选的merge方式虽然用了outer,但其实left join更贴合你的需求,能确保完整保留df的所有日期。
第一步:检查并统一日期列的数据类型
最常见的坑就是df和sub的date列类型不一致:比如一个是字符串object类型,一个是datetime64类型。这种情况下merge时无法正确识别相同日期,甚至会看似保留了部分日期,但丢失了后续需要显示NaN的行。
先运行这段代码确认类型:
print("df的date列类型:", df['date'].dtype) print("sub的date列类型:", sub['date'].dtype)
如果类型不一致,统一转换成datetime类型:
df['date'] = pd.to_datetime(df['date']) sub['date'] = pd.to_datetime(sub['date'])
第二步:用Left Merge替代Outer Merge
你的需求是完整保留df的所有日期,仅把sub的对应数值填充进去,未匹配的日期显示NaN。这种场景下,how='left'的merge比outer更精准——outer会同时保留两个表中所有不匹配的行,而你只需要保留左表(df)的全部内容。
执行以下代码就能得到你想要的结果:
res = df.merge(sub, on='date', how='left')
另一种更直观的方法:通过索引Join实现
你也可以把日期设为索引后使用join方法,逻辑更清晰:
# 将date列设为索引 df_indexed = df.set_index('date') sub_indexed = sub.set_index('date') # 左连接后重置索引,恢复date列为普通列 res = df_indexed.join(sub_indexed, how='left').reset_index()
为什么之前的Outer Merge没生效?
如果日期类型已经一致,但outer merge仍未保留df的后续日期,那可能是你的df实际上并没有包含2018-04-21至2018-04-30的日期(比如生成df时出错)。可以用这段代码验证df的日期范围:
print("df的最早日期:", df['date'].min()) print("df的最晚日期:", df['date'].max())
内容的提问来源于stack exchange,提问作者prre72
相关产品推荐
相关产品推荐

