Pandas合并两个DataFrame后结果全为NaN问题求助
解决Pandas合并后右表列全为NaN的问题
首先,你遇到的这个问题核心大概率是:两个DataFrame的Merged列没有任何完全匹配的取值——哪怕你把所有列转成了字符串,只要键值本身不重合,left join后右表的列自然会全是NaN。下面给你一步步排查和解决的思路:
1. 先确认是否存在匹配的键值
先运行几行代码验证两个表的Merged列有没有交集:
# 提取两个列的唯一值集合,求交集 common_keys = set(PG['Merged']).intersection(SCH['Merged']) print(f"两个表共有的Merged值数量:{len(common_keys)}") # 随机抽取PG的5个值,检查是否在SCH中存在 sample_check = PG['Merged'].sample(5).isin(SCH['Merged']) print("随机抽样的匹配结果:") print(sample_check)
如果输出的数量是0,且抽样结果全为False,那就能100%确定:两个表的Merged列没有重叠的记录,这就是Today-Shift列全NaN的根本原因。
2. 分析键值不匹配的可能原因
从你给出的示例数据来看:
- PG的
Merged值是140042022-05-09 00:00:00这类,SCH的是147212022-03-01 00:00:00这类 - 前几位编号(14004 vs 14721)完全不同,日期范围也不重叠(5月 vs 3月),这本身就说明两个表的
Merged列大概率没有可匹配的记录。
除此之外,还要排查隐藏的格式问题:
- 前后空格:转成字符串后可能存在看不见的空格,先清理后再试:
PG['Merged'] = PG['Merged'].str.strip() SCH['Merged'] = SCH['Merged'].str.strip() - 日期格式差异:如果
Merged列是由日期拼接而来,原日期可能带时区信息(比如datetime64[ns, UTC]),转字符串后会多出+00:00后缀,而本地日期转字符串不会,导致不匹配。可以检查原日期列的类型:
如果有时区差异,需要先统一时区再拼接成print(PG['原日期列'].dtype) print(SCH['原日期列'].dtype)Merged列。
3. 验证合并逻辑是否正常
如果不确定是不是合并代码的问题,可以手动造一条匹配数据测试:
# 把PG的第一行Merged值改成SCH中存在的某个值 PG.loc[0, 'Merged'] = '147212022-03-01 00:00:00' # 重新执行合并 PG_merged = pd.merge(left=PG.astype(str), right=SCH.astype(str), how='left', left_on='Merged', right_on='Merged', suffixes=('', '_remove')) # 查看第一行的Today-Shift值 print(PG_merged.loc[0, 'Today-Shift'])
如果这一行的Today-Shift有值,那就彻底证明:问题出在两个表的Merged列没有匹配的键,而不是合并代码的逻辑错误。
最后总结
如果业务上确实认为两个表应该有匹配的记录,那你需要回头检查Merged列的生成逻辑——是不是两边的拼接规则不一致(比如编号位数、日期格式),或者数据来源本身就有偏差。如果业务上确认两个表确实没有重叠的记录,那全NaN的结果就是合理的。
内容的提问来源于stack exchange,提问作者Mohamed Khamees
相关产品推荐
相关产品推荐

