基于公共值合并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
相关产品推荐
相关产品推荐

