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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:43:12