左连接合并两个Pandas DataFrame未达预期结果求助
问题解决:Pandas Left Join后行数异常增加且大量NaN
问题原因分析
- 合并键匹配错误:左表
Reason Not Done列存储的是原因代码(如EMFREAS4),右表中对应的代码列是RND_COLUMNS,而非MIREASND(MIREASND是代码对应的说明文本)。你错误地将MIREASND作为匹配键,导致绝大多数行无法匹配,产生大量NaN。 - 右表空值引发笛卡尔积:右表存在大量
MIREASND为空的行,当用ACCSNM+空值MIREASND作为匹配键时,左表中同一ACCSNM的所有行都会与这些空值行匹配,直接导致行数暴增。
解决方案
1. 修正合并键
将右表的匹配列从MIREASND改为RND_COLUMNS,确保原因代码与对应列匹配:
merged_df = pd.merge( ln_sdtm, rnd_melt, left_on=["ACCSNM", "Reason Not Done"], right_on=["ACCSNM", "RND_COLUMNS"], # 修正为RND_COLUMNS how="left", suffixes=(None, '_R') ).sort_values(["ACCSNM", "Row Number"]).reset_index(drop=True) # drop=True避免保留旧索引
2. 可选:清理右表无效空值行
如果右表中RND_COLUMNS为空的行是无效数据,可先过滤再合并,减少不必要的匹配:
# 过滤右表中RND_COLUMNS非空的行 clean_rnd_melt = rnd_melt[rnd_melt["RND_COLUMNS"].notna()] # 执行合并 merged_df = pd.merge( ln_sdtm, clean_rnd_melt, left_on=["ACCSNM", "Reason Not Done"], right_on=["ACCSNM", "RND_COLUMNS"], how="left", suffixes=(None, '_R') ).sort_values(["ACCSNM", "Row Number"]).reset_index(drop=True)
验证结果
修正后,合并后的DataFrame行数应与左表一致(265行),MIREASND列仅在右表无对应代码说明时出现NaN,而非大量空值。
内容的提问来源于stack exchange,提问作者Asha Richardson
相关产品推荐
相关产品推荐

