合并两个列结构相同的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
相关产品推荐
相关产品推荐

