Python 合并3个或更多数据帧

Python 合并3个或更多数据帧,python,pandas,Python,Pandas,我正在尝试通过索引合并3个数据帧,但是到目前为止没有成功 代码如下: import pandas as pd from functools import reduce #identifying csvs x='/home/' csvpaths = ("Data1.csv", "Data2.csv", "Data3.csv") dfs = list() # an empty list #creating dataframes based on number of csvs for i

我正在尝试通过索引合并3个数据帧,但是到目前为止没有成功

代码如下:

import pandas as pd
from functools import reduce

#identifying csvs

x='/home/'
csvpaths = ("Data1.csv", "Data2.csv", "Data3.csv")
dfs = list()   # an empty list

#creating dataframes based on number of csvs

for i in range (len(csvpaths)):
    dfs.append(pd.read_csv(str(x)+ csvpaths[i],index_col=0))
print(dfs[1])

#creating suffix for each dataframe's columns
S=[]

for y in csvpaths:
    s=str(y).split('.csv')[0]
    S.append(s)
print(S)



#merging attempt
dfx = lambda a,b: pd.merge(a,b,on='SHIP_ID',suffixes=(S)), dfs

print(dfx)
print(dfx.columns)
如果我尝试将其导出为csv,则会出现如下错误(当我尝试打印dfx.columns时出现类似错误): “tuple”对象没有“to_csv”属性

我想要的输出是如下3个数据帧的合并(带有各自的后缀),请帮助

[注:下表非常简化,原始表由几十列和数千行组成,因此需要实际的合并方法]

试试:

用于邮政编码中的s、el(后缀、dfs):
el.columns=[str(col)+s表示el.columns中的col]
dfx=pd.concat(dfs,ignore_index=True,sort=False,axis=1)
对于我使用的测试用例:

将熊猫作为pd导入
dfs=[pd.DataFrame({“x”:[1,2,7],“y”:列表(“ghi”)}),pd.DataFrame({“x”:[5,6],“z”:[4,4]}),pd.DataFrame({“x”:列表(“acgjksd”)})]
后缀=[“_1”、“_2”、“_3”]
对于s,zip中的el(后缀,dfs):
el.columns=[str(col)+s表示el.columns中的col]
>>>pd.concat(dfs,忽略索引=True,排序=False,轴=1)
x_1 y_1 x_2 z_2 x_3
0 1.0克5.0 4.0安
1 2.0高6.0 4.0摄氏度
2 7.0 i楠楠g
3南j
4南角
5南s
6南d

编辑

用于邮政编码中的s、el(后缀、dfs):
el.columns=[str(col)+s表示el.columns中的col]
el.set_索引('ID',就地=真)
dfx=pd.concat(dfs,忽略索引=False,排序=False,轴=1)。重置索引()

试试reduce:我试过了。详情见上文。任何其他选项请共享输入数据和预期输出dfx=reduce(lambda left,right:pd.merge(left,right,on=None,how='outer',),dfs)这只适用于2个数据帧,而不是3个想法?对不起,我无法共享输入数据。我如上所述共享的输出数据。每个数据帧由一列和iam组成,通过索引合并。后缀位起作用。然而,关于数据帧的合并并没有起作用,因为我的索引是一个序列号,并且每个数据都不相同。有没有办法用merge或functools/reduce方法解决这个问题呢?是的,现在就试试看——只是
忽略_index=True
排序=False
嗨,它不起作用。相反,我为前两个dfs创建了一个初始合并数据帧,然后为剩余的dfs创建了一个for循环(在上面的示例中,我有3dfs,但我正在创建一个必须处理3个或更多的代码),如下所示:df=pd.merge(dfs[0],dfs[1],on='ID',how='outer')L=0,用于范围内的i(len(dfs)-2):L=L+1 df=pd.merge(df,dfs[L+1],on='ID',how='outer')嗯,这有点过分了,所以您基本上希望对数组中的所有数据帧进行完全外部联接,对吗<代码>ID是否为密钥?我认为我的编辑应该可以做到这一点,然后我在一个更简化的数据帧列表上尝试了pd.concat,它工作得很好。不确定为什么我在更大/更复杂的dfs上出现错误可能是由于您建议的原因。我去看看。