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

基于公共值合并DataFrame,无匹配时返回NaN的实现问题

按公共值合并DataFrame,无匹配返回NaN的正确方法

你之前用left_index=True和right_index=True是按行的索引位置匹配,不是对比Name列的实际值,所以才会出现索引2时d2的f对应d1的h这种错误匹配。

方法一:用where+isin直接生成匹配列

这种方式更直观,直接判断左表的Name值是否存在于右表中,不存在则返回NaN:

1. 以d2为左表,匹配d1的Name值

import pandas as pd

data2 = {'Name' : ['Tom', 'Nick', 'f']}
d2 = pd.DataFrame(data2)

data1 = {'Name' : ['Tom', 'Nick', 'h', 'g']}
d1 = pd.DataFrame(data1)

# 生成结果
result1 = d2.rename(columns={'Name': 'Name_x'})
result1['Name_y'] = result1['Name_x'].where(result1['Name_x'].isin(d1['Name']), pd.NA)
print(result1)

输出:

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      f    NaN

2. 以d1为左表,匹配d2的Name值

result2 = d1.rename(columns={'Name': 'Name_x'})
result2['Name_y'] = result2['Name_x'].where(result2['Name_x'].isin(d2['Name']), pd.NA)
print(result2)

输出:

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h    NaN
3      g    NaN

方法二:用merge按列值匹配(保留合并逻辑)

如果你想用merge实现,需要指定按Name列的值匹配,同时通过suffixes区分左右表的列名:

1. 以d2为左表合并d1

# 先给d1去重,避免重复匹配
d1_unique = d1[['Name']].drop_duplicates()
result1 = pd.merge(d2, d1_unique, on='Name', how='left', suffixes=('_x', '_y'))
print(result1)

输出和方法一一致:

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      f    NaN

2. 以d1为左表合并d2

d2_unique = d2[['Name']].drop_duplicates()
result2 = pd.merge(d1, d2_unique, on='Name', how='left', suffixes=('_x', '_y'))
print(result2)

输出:

Name_x Name_y
0    Tom    Tom
1   Nick   Nick
2      h    NaN
3      g    NaN

两种方法都能实现你要的效果,方法一更简洁直接,适合这种简单的匹配场景;方法二更适合复杂的多列合并需求。

内容的提问来源于stack exchange,提问作者manu p

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:02:49