Pandas Merge未按预期执行:匹配结果错误且存在缺失值
Pandas Merge未按预期执行:匹配结果错误且存在缺失值
看起来你遇到的问题大概率是两个常见原因导致的:字符串存在隐形空格或者merge后的索引错位导致赋值错误,我来帮你一步步排查和解决:
首先排查隐形空格问题
虽然你已经确认了两列的 dtype 都是object(字符串类型),但很可能其中一列的Country值带有前后空格(比如" UK"或者"UK "),肉眼完全看不出来,但字符串实际不相等,导致merge时无法正确匹配。
你可以先检查两个DataFrame的Country唯一值,看看是否存在不一致:
print("UserInfo的Country唯一值:", UserInfo['Country'].unique()) print("refcompanylookup的Country唯一值:", refcompanylookup['Country'].unique())
如果发现有带空格的情况,先清洗两列的空格:
# 去除Country列前后的所有空白字符 UserInfo['Country'] = UserInfo['Country'].str.strip() refcompanylookup['Country'] = refcompanylookup['Country'].str.strip()
然后修正merge的赋值方式
你原来的写法UserInfo['Mapped Company'] = UserInfo.merge(...)['Company']很容易出现索引错位的问题:merge操作会生成一个新的DataFrame,它的索引和原UserInfo的索引不一定完全一致,直接取['Company']列赋值时,Pandas会按索引对齐,导致值被放到错误的行上(这就是为什么你看到UK的行对应了US公司的原因)。
推荐两种更可靠的写法:
方法1:用map方法(更简洁高效)
先把refcompanylookup转换成一个国家到公司的映射字典,再用map直接映射:
# 创建国家-公司的映射字典 country_company_map = refcompanylookup.set_index('Country')['Company'].to_dict() # 给UserInfo新增映射列 UserInfo['Mapped Company'] = UserInfo['Country'].map(country_company_map)
方法2:正确使用merge并保留原数据
如果一定要用merge,应该把merge后的结果和原DataFrame整合,而不是直接取列赋值:
# 执行left merge,on参数可以简化(因为两边列名都是Country) merged_df = UserInfo.merge(refcompanylookup, how='left', on='Country') # 重命名列并保留需要的字段(可选) UserInfo = merged_df.rename(columns={'Company': 'Mapped Company'})[['Employee ID', 'Country', 'Mapped Company']]
按照上面的步骤处理后,应该就能得到正确的映射结果了。
备注:内容来源于stack exchange,提问作者andrew1990
相关产品推荐
相关产品推荐

