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

Pandas中DataFrame关联时部分匹配行返回NaN的问题解决

DataFrame重复ID匹配返回NaN的解决方案

问题场景

现有两个DataFrame:
df1:

|id|name| 
|2|op|
|4|kl|
|5|jk|

df2:

|id_no|
|4|
|2|
|5|
|2|
|1|

需求是将df1中的name列根据ID匹配关联到df2中,使用以下代码实现:

df2['id_no'] = df2['id_no'].astype('int64')
df1['id'] = df1['id'].astype('int64')

df2['names'] = df2['id_no'].map(df1.set_index('id')['name'])

但得到的结果出现异常:第二个id_no=2的行未匹配到对应name,返回了NaN:

|id_no|names|
|4|kl|
|2|op|
|5|jk|
|2|NaN|
|1|NaN|

解决方案

方法一:用merge替代map(推荐)

merge是Pandas专为关联场景设计的方法,稳定性远高于map,能完美处理重复匹配的情况:

# 统一数据类型
df2['id_no'] = df2['id_no'].astype('int64')
df1['id'] = df1['id'].astype('int64')

# 左关联保留df2所有行,完成匹配后整理列名
df_result = df2.merge(df1, left_on='id_no', right_on='id', how='left')
df_result = df_result.drop('id', axis=1).rename(columns={'name': 'names'})

执行后可得到正确结果:

|id_no|names|
|4|kl|
|2|op|
|5|jk|
|2|op|
|1|NaN|

方法二:修复map的使用前提

如果坚持使用map,需确保df1的id列唯一(若存在重复值需先去重):

# 去除df1中重复的id记录
df1 = df1.drop_duplicates(subset='id')
# 执行map匹配
df2['names'] = df2['id_no'].map(df1.set_index('id')['name'])

额外排查方向

若上述方法无效,需检查数据是否存在隐性问题:

  • df2的id_no列是否有空格、隐藏字符:可先通过df2['id_no'] = df2['id_no'].astype(str).str.strip().astype('int64')清洗数据。
  • df1的id列是否存在类似格式问题,同样先清洗再执行关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:01:56