Pandas合并两个DataFrame如何避免出现整列NaN值?
左连接后右表字段全为NaN的解决方法
问题根因
出现该问题是两个表的Date字段匹配规则不一致导致的,常见原因如下:
- 两个表
Date字段数据类型不同,一个为datetime类型、另一个为字符串类型,pandas判定二者不相等 Date字段的文本格式不一致,例如一个为2019-01-01格式,另一个为2019/01/01、01-01-2019格式,或字段值存在隐藏的前后空格- traffic_df的
Date字段携带了时分秒信息,和仅保留日期的co_dfDate无法匹配 - 未提前过滤traffic_df的2019年数据,可能存在数据范围偏差
解决步骤
- 统一将两个表的
Date字段转为datetime类型,自动兼容不同格式的日期文本
co_df['Date'] = pd.to_datetime(co_df['Date']) traffic_df['Date'] = pd.to_datetime(traffic_df['Date'])
- 统一去除
Date字段的时分秒部分,仅保留日期维度
co_df['Date'] = co_df['Date'].dt.date traffic_df['Date'] = traffic_df['Date'].dt.date # 也可统一转为指定格式的字符串,效果一致 # co_df['Date'] = co_df['Date'].dt.strftime('%Y-%m-%d') # traffic_df['Date'] = traffic_df['Date'].dt.strftime('%Y-%m-%d')
- 提前过滤traffic_df仅保留2019年数据,减少无效数据干扰
traffic_df_2019 = traffic_df[traffic_df['Date'].dt.year == 2019].copy()
- 重新执行左连接操作
df = pd.merge(co_df, traffic_df_2019, how="left", on="Date")
验证方法
可以先执行以下代码验证匹配逻辑是否生效:
# 取co_df的第一个日期,判断是否存在于traffic_df的Date字段中 sample_date = co_df['Date'].iloc[0] print(sample_date in traffic_df_2019['Date'].values)
如果输出为True说明匹配规则正常,执行左连接即可得到正确结果。
内容的提问来源于stack exchange,提问作者nsakash
相关产品推荐
相关产品推荐

