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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:52:48