如何合并列表中含共同列的多个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
相关产品推荐
相关产品推荐

