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

如何合并列表中含共同列的多个DataFrame(支持多元素场景)

合并多个DataFrame(基于共同列a和b)

看起来你需要将一个包含多个DataFrame的列表,基于共同的a和b列进行合并,而且要支持超过两个DataFrame的场景。你的示例中每个DataFrame的(a,b)组内行数一致,内连接后刚好能得到一一对应的结果,完全符合需求。

解决方案:使用functools.reduce迭代合并

pd.merge一次只能处理两个DataFrame,而functools.reduce可以帮你把合并操作迭代应用到整个列表上,依次将每个新的DataFrame合并到结果中。

步骤1:导入必要的库

import pandas as pd
from functools import reduce

步骤2:构造示例数据(用于验证)

# 构造df1
df1 = pd.DataFrame({
    'a': [1,1,1,1],
    'b': [2,2,2,3],
    'c': [4,3,6,9]
})

# 构造df2
df2 = pd.DataFrame({
    'a': [1,1,1,1],
    'b': [2,2,2,3],
    'd': [9,11,6,3]
})

# 模拟包含多个DataFrame的列表(比如新增df3)
df3 = pd.DataFrame({
    'a': [1,1,1,1],
    'b': [2,2,2,3],
    'e': [10,20,30,40]
})
dfList = [df1, df2, df3]

步骤3:使用reduce合并所有DataFrame

我们指定on=['a','b']作为连接键,how='inner'确保只保留所有DataFrame中都存在的(a,b)组合:

# 定义合并函数,明确连接键和合并方式
merge_func = lambda left, right: pd.merge(left, right, on=['a','b'], how='inner')

# 迭代合并整个列表
df_final = reduce(merge_func, dfList)

运行后得到的df_final结果如下:

a  b  c   d   e
0  1  2  4   9  10
1  1  2  3  11  20
2  1  2  6   6  30
3  1  3  9   3  40

方法说明

  • reduce会从列表第一个元素开始,先合并df1和df2得到中间结果,再将中间结果与df3合并,以此类推直到处理完所有DataFrame。
  • 指定on=['a','b']可以确保合并严格基于这两个共同列,避免后续新增同名列时出现意外合并。
  • how='inner'保证只有在所有DataFrame中都存在的(a,b)组合才会被保留,完全匹配你示例中的需求。

备选方案:行顺序完全对齐时可用

如果你的所有DataFrame行顺序完全一致(即每个索引位置的行对应的a和b值都相同),也可以直接用pd.concat按列拼接:

df_final = pd.concat(dfList, axis=1)
# 去重重复的a、b列
df_final = df_final.loc[:,~df_final.columns.duplicated()]

但这种方法依赖索引对齐,若某个DataFrame行顺序变动,结果会出错,可靠性不如merge方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:37:35