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
相关产品推荐
相关产品推荐

