如何使用pandas.merge合并列名重合的多个DataFrame得到指定结果?
Pandas 多数据框合并实现目标结果
嘿,我来帮你搞定这个合并需求!先理清楚你的场景:你有三个DataFrame,其中df1是包含所有id的主表,df2和df3分别包含部分id对应的B值,想要把它们合并成保留df1所有行、对应B值匹配填充、无匹配则显示NaN的结果。
首先先把你给出的原始数据代码贴出来方便参考:
import pandas as pd df1 = pd.DataFrame({'id': list('fghij'), 'A': ['A' + str(i) for i in range(5)]}) # df1输出: # A id # 0 A0 f # 1 A1 g # 2 A2 h # 3 A3 i # 4 A4 j df2 = pd.DataFrame({'id': list('fg'), 'B': ['B' + str(i) for i in range(2)]}) # df2输出: # B id # 0 B0 f # 1 B1 g df3 = pd.DataFrame({'id': list('ij'), 'B': ['B' + str(i) for i in range(3, 5)]}) # df3输出: # B id # 0 B3 i # 1 B4 j
想要得到你目标中的结果,核心思路是先把df2和df3合并成完整的B列数据,再和df1做左连接,具体实现代码如下:
# 第一步:拼接df2和df3,得到包含所有B值的完整数据框 combined_b = pd.concat([df2, df3], ignore_index=True) # 第二步:以id为连接键,将df1和combined_b做左连接 final = df1.merge(combined_b, on='id', how='left') # 查看结果 print(final)
运行后就能得到你想要的输出:
A id B 0 A0 f B0 1 A1 g B1 2 A2 h NaN 3 A3 i B3 4 A4 j B4
简单解释下关键步骤:
pd.concat([df2, df3], ignore_index=True):把两个结构相同的DataFrame按行拼接,ignore_index=True用来重置索引,避免拼接后出现重复的索引值。merge(..., how='left'):左连接会完全保留左边df1的所有行,右边combined_b中能匹配到id的就填充对应的B值,没有匹配到的(比如id='h')就自动填充NaN,完美契合你的需求。
如果你想写得更简洁,也可以把两步合并成一行代码:
final = df1.merge(pd.concat([df2, df3], ignore_index=True), on='id', how='left')
效果和上面的代码完全一样,只是少了一个中间变量而已。
内容的提问来源于stack exchange,提问作者d4tm4x
相关产品推荐
相关产品推荐

