如何在Python中合并两个DataFrame,保留左表所有行并更新指定列
Python合并DataFrame:用右表E列覆盖左表对应值的实现方法
你需要保留左表(Table 1)所有行,并用右表(Table 2)的E列值覆盖左表对应行的E列,用pd.merge的话需要处理合并后的重复列,或者用更高效的update方法,以下是两种可行方案:
示例数据
Table 1:
A B C D E 1 mm nn oo 12 2 aa bb cc 12 3 xx yy zz 12 4 jj kk ll 12 5 rr ss tt 12 6 gg hh ii 12
Table 2:
A B C D E 2 aa bb cc 5 3 xx yy zz 5 4 jj kk ll 5
预期结果:
A B C D E 1 mm nn oo 12 2 aa bb cc 5 3 xx yy zz 5 4 jj kk ll 5 5 rr ss tt 12 6 gg hh ii 12
方案一:左连接后处理列
用pd.merge左连接两个表,指定连接键为A/B/C/D,合并后会生成E_x(左表的E)和E_y(右表的E),再通过fillna用E_y覆盖E_x,最后删除多余列:
import pandas as pd # 构造示例DataFrame df1 = pd.DataFrame({ 'A': [1,2,3,4,5,6], 'B': ['mm','aa','xx','jj','rr','gg'], 'C': ['nn','bb','yy','kk','ss','hh'], 'D': ['oo','cc','zz','ll','tt','ii'], 'E': [12]*6 }) df2 = pd.DataFrame({ 'A': [2,3,4], 'B': ['aa','xx','jj'], 'C': ['bb','yy','kk'], 'D': ['cc','zz','ll'], 'E': [5]*3 }) # 左连接,指定连接键 merged = pd.merge(df1, df2, on=['A','B','C','D'], how='left') # 用右表E值覆盖左表,空值保留原左表值 merged['E'] = merged['E_y'].fillna(merged['E_x']) # 删除多余列 result = merged.drop(columns=['E_x', 'E_y']) print(result)
方案二:用update方法高效更新
update方法会直接用右表的非空值更新左表,需要先将两个表的连接键设为索引,更新后再重置索引:
import pandas as pd # 构造示例DataFrame df1 = pd.DataFrame({ 'A': [1,2,3,4,5,6], 'B': ['mm','aa','xx','jj','rr','gg'], 'C': ['nn','bb','yy','kk','ss','hh'], 'D': ['oo','cc','zz','ll','tt','ii'], 'E': [12]*6 }) df2 = pd.DataFrame({ 'A': [2,3,4], 'B': ['aa','xx','jj'], 'C': ['bb','yy','kk'], 'D': ['cc','zz','ll'], 'E': [5]*3 }) # 将连接键设为索引 df1.set_index(['A','B','C','D'], inplace=True) df2.set_index(['A','B','C','D'], inplace=True) # 用df2的E列更新df1的E列 df1['E'].update(df2['E']) # 重置索引恢复原结构 result = df1.reset_index() print(result)
两种方法都能得到你要的结果,方案一逻辑直观适合新手理解,方案二更适合处理大数据量的场景。
内容的提问来源于stack exchange,提问作者Alpha Beta
相关产品推荐
相关产品推荐

