Pandas合并两个具有不同列的数据帧

时间:2015-01-22 19:37:02

标签: python pandas dataframe data-munging

我肯定在这里遗漏了一些简单的东西。试图在大多数具有相同列名的pandas中合并两个数据帧,但是右边的数据框有一些左边没有的列,反之亦然。

>df_may

  id  quantity  attr_1  attr_2
0  1        20       0       1
1  2        23       1       1
2  3        19       1       1
3  4        19       0       0

>df_jun

  id  quantity  attr_1  attr_3
0  5         8       1       0
1  6        13       0       1
2  7        20       1       1
3  8        25       1       1

我尝试加入外部联接:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")

但是这会产生:

Left data columns not unique: Index([....

我还指定了一个要加入的列(on =" id",例如),但这会重复所有列,除了" id"比如attr_1_x,attr_1_y,这并不理想。我还将整个列列表(有很多列)传递给" on":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))

哪个收益率:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

我错过了什么?我希望获得一个附加了所有行的df,attr_1,attr_2,attr_3尽可能填充,NaN不会显示。这似乎是一个非常典型的数据调整工作流程,但我已经陷入困境。

提前致谢。

2 个答案:

答案 0 :(得分:52)

我认为在这种情况下concat就是你想要的:

In [12]:

pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
   attr_1  attr_2  attr_3  id  quantity
0       0       1     NaN   1        20
1       1       1     NaN   2        23
2       1       1     NaN   3        19
3       0       0     NaN   4        19
4       1     NaN       0   5         8
5       0     NaN       1   6        13
6       1     NaN       1   7        20
7       1     NaN       1   8        25

在这里传递axis=0,你将df堆叠在一起,我相信你想要的那样,然后产生NaN值,它们不在各自的dfs中。< / p>

答案 1 :(得分:0)

今天我使用concat,append或merge中的任何一个来解决这个问题,我通过添加一个顺序编号的辅助列然后进行外连接来解决它

helper=1
for i in df1.index:
    df1.loc[i,'helper']=helper
    helper=helper+1
for i in df2.index:
    df2.loc[i,'helper']=helper
    helper=helper+1
df1.merge(df2,on='helper',how='outer')