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

Pandas合并DataFrame后无法更新全部匹配行的问题求助

Pandas合并DataFrame后无法更新全部匹配行的问题求助

我最近在处理Pandas DataFrame的时候遇到了一个头疼的问题:我想基于共同列ID把两个DataFrame合并,然后用第二个DataFrame(reference)里的值去更新原始DataFrame(df)的Target Value列。明明ID都是完全匹配的,但就是只有部分行能被更新——比如这次测试里有5行,结果只更新了前2行,剩下3行的Target Value还是NaN。

先给大家看看我的数据:

原始DataFrame(df)

ID  Other Column  Target Value
0  ID00123       Value A          NaN
1  ID00456       Value B          NaN
2  ID00789       Value C          NaN
3  ID01012       Value D          NaN
4  ID01345       Value E          NaN

参考DataFrame(reference)

ID  Reference Value
0  ID00123         RefVal1
1  ID00456         RefVal2
2  ID00789         RefVal3
3  ID01012         RefVal4
4  ID01345         RefVal5

我尝试的代码

# Merge dataframes on 'ID'
merged = df.merge(reference, on='ID', how='left', indicator=True)

# Create a mask for rows to update
mask = (
    (merged['_merge'] == 'both') &  # Exists in both DataFrames
    (df['Target Value'].isna())    # 'Target Value' is NaN
)

# Update 'Target Value' in df
df.loc[mask, 'Target Value'] = merged.loc[mask, 'Reference Value']

合并后的DataFrame看起来一切正常,所有行的_merge都是both:

ID  Other Column  Target Value Reference Value _merge
0  ID00123       Value A          NaN         RefVal1   both
1  ID00456       Value B          NaN         RefVal2   both
2  ID00789       Value C          NaN         RefVal3   both
3  ID01012       Value D          NaN         RefVal4   both
4  ID01345       Value E          NaN         RefVal5   both

但更新后的原始df就不对劲了,只有前两行被更新:

ID  Other Column  Target Value
0  ID00123       Value A       RefVal1
1  ID00456       Value B       RefVal2
2  ID00789       Value C          NaN  # 这行没更新
3  ID01012       Value D          NaN  # 这行也没更新
4  ID01345       Value E          NaN  # 还有这行

我已经排查了很多可能性:

  • 试过用内连接代替左连接,结果还是只有部分行被更新
  • 检查过ID列的数据类型,两个DataFrame里都是object类型
  • 给ID列做了清洗:去掉前后空格并转成小写,代码如下:
    df['ID'] = df['ID'].str.strip().str.lower()
    reference['ID'] = reference['ID'].str.strip().str.lower()
    
  • 检查过两个DataFrame里的ID是否有不匹配的情况,结果两个集合都是空的:
    unmatched_df = set(df['ID']).difference(reference['ID'])
    unmatched_reference = set(reference['ID']).difference(df['ID'])
    print(unmatched_df, unmatched_reference)  # 输出都是空集合
    
  • 确认过没有重复行,整个df里就只有10行数据(测试用的是5行)

而且这不是第一次遇到这个问题了!之前处理5万多条数据的时候也出现过:合并表显示所有行都匹配,但就是只有部分行能被更新。更奇怪的是,当时去重后的表无法正常更新,但保留重复行的表反而能正常工作。

有没有大佬能帮我看看这到底是哪里出问题了?谢谢大家!

备注:内容来源于stack exchange,提问作者melca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:18:06