Pandas Python:连接具有相同列的数据框

时间:2018-09-06 12:27:38

标签: python pandas concatenation

我有3个数据框,它们的列名彼此相同。 说:

df1
column1   column2   column3
a         b         c
d         e         f


df2
column1   column2   column3
g         h         i
j         k         l


df3
column1   column2   column3
m         n         o
p         q         r

每个数据框具有不同的值,但列相同。 我尝试了append和concat,以及合并外部但有错误。 这是我尝试过的:

df_final = df1.append(df2, sort=True,ignore_index=True).append2(df3, sort=True,ignore_index=True)

我也尝试过:     df_final = pd.concat([df1, df2, df3], axis=1)

但是我得到这个错误: AssertionError: Number of manager items must equal union of block items# manager items: 61, # tot_items: 62

我已经搜索了错误,但似乎无法理解为什么发生这种情况。 任何指导深表感谢!

4 个答案:

答案 0 :(得分:3)

我认为某些或所有DataFrame中的列名重复存在问题。

#simulate error
df1.columns = ['column3','column1','column1']
df2.columns = ['column5','column1','column1']
df3.columns = ['column2','column1','column1']

df_final = pd.concat([df1, df2, df3])
  

AssertionError:管理器项的数量必须等于块项的并集       #个经理项目:4,#tot_items:5

您可以找到重复的列名称:

print (df3.columns[df3.columns.duplicated(keep=False)])
Index(['column1', 'column1'], dtype='object')

可能的解决方案是按列表设置列名:

df3.columns = ['column1','column2','column3']
print (df3)
  column1 column2 column3
0       m       n       o
1       p       q       r

或删除具有重复名称的重复列:

df31 = df3.loc[:, ~df3.columns.duplicated()]
print (df31)
  column2 column1
0       m       n
1       p       q

然后concatappend应该很好用。

答案 1 :(得分:0)

尝试不提供轴示例:

import pandas as pd
mydict1 = {'column1' : ['a','d'],
          'column2' : ['b','e'],
          'column3' : ['c','f']}
mydict2 = {'column1' : ['g','j'],
          'column2' : ['h','k'],
          'column3' : ['i','i']}
mydict3= {"column1":['m','p'],
          "column2":['n','q'],
          "column3":['o','r']}
df1=pd.DataFrame(mydict1)
df2=pd.DataFrame(mydict2)
df3=pd.DataFrame(mydict3)

pd.concat([df1,df2,df3],ignore_index=True)

输出

     column1    column2    column3
0      a           b         c
1      d           e         f
0      g           h         i
1      j           k         i
0      m           n         o
1      p           q         r

答案 2 :(得分:0)

您可以在代码中删除id

.box001

答案 3 :(得分:0)

给予

df1
column1   column2   column3
a         b         c
d         e         f


df2
column1   column2   column3
g         h         i
j         k         l

使用df.join()方法时可以指定后缀。

df1.join(df2, lsuffix="_first", rsuffix=("_second"))

这将导致单个数据帧

df1
column1_first   column2_first   column3_first   column1_second   column2_second   columnd 2_second
a               b               c               g                h                i
d               e               f               j                k                l