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

合并两个列结构相同的Pandas DataFrame更新左表产生多余列如何解决

问题原因

pd.merge的设计逻辑是拼接两个表的列而非覆盖同名列值,当左右表存在除连接键key外的同名列时,会自动添加_x(左表来源)、_y(右表来源)后缀做区分,因此不会直接得到你要的覆盖更新效果。

解决方案

方案1:使用update方法(最适配需求,代码更简洁)

pandas内置的update方法就是专门用于用一个表的匹配行数据更新另一个表,代码如下:

import pandas as pd

left = pd.DataFrame({"key": ["K0", "K1", "K2", "K3"],
            "A": [pd.NA, pd.NA, pd.NA, pd.NA],
        "B": ["B0", "B1", "B2", "B3"],})
right = pd.DataFrame({"key": ["K1", "K2", "K3"],    
        "A": ["C1", "C2", "C3"],    
        "B": [ "B1", "B2", "B3"]})

# 将key设为索引用于匹配
left = left.set_index('key')
right = right.set_index('key')
# 用右表非空值更新左表,overwrite=True表示即使左表有值也会被右表非空值覆盖
left.update(right, overwrite=True)
# 恢复key为普通列
result = left.reset_index()

方案2:merge后手动合并列

如果要保留merge的写法,可以合并后缀列后删除多余列:

import pandas as pd

left = pd.DataFrame({"key": ["K0", "K1", "K2", "K3"],
            "A": [pd.NA, pd.NA, pd.NA, pd.NA],
        "B": ["B0", "B1", "B2", "B3"],})
right = pd.DataFrame({"key": ["K1", "K2", "K3"],    
        "A": ["C1", "C2", "C3"],    
        "B": [ "B1", "B2", "B3"]})

# 合并时自定义后缀方便识别
result = pd.merge(left, right, on="key", how='left', suffixes=('_left', '_right'))
# 遍历所有非key列,优先取右表值,右表为空时保留左表值
for col in left.columns:
    if col != 'key':
        result[col] = result[f'{col}_right'].fillna(result[f'{col}_left'])
# 只保留原结构的列
result = result[left.columns]

两种方案运行后得到的result都和你的预期输出一致。

内容的提问来源于stack exchange,提问作者Mainland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:06:01