将新数据帧添加到现有数据库,但仅在列名匹配时添加

时间:2018-02-20 00:49:07

标签: python pandas dataframe

我有两个数据帧正在尝试合并,但我没有使用pandas.concat获得我想要的结果。

我有一个数据库,我想要添加新数据,但仅限于名称列匹配。

我们说df1是:

A B C D
1 1 2 2
3 3 4 4
5 5 6 6

和df2是:

A E D F
7 7 8 8
9 9 0 0

我想得到的结果是:

A B C D
1 1 2 2
3 3 4 4
5 5 6 6
7 - - 8
9 - - 0

空白数据不一定是-它可以是任何东西。

当我使用时:

results = pandas.concat([df1, df2], axis=0, join='outer')

它为我提供了一个包含所有A到F列的新数据框,而不是我想要的。关于如何实现这一目标的任何想法?谢谢!

4 个答案:

答案 0 :(得分:6)

您希望使用pd.DataFrame.align方法并指定您希望与left参数的索引对齐,并且您只关心列。

d1, d2 = df1.align(df2, join='left', axis=1)

然后您可以使用pd.DataFrame.appendpd.concat

pd.concat([d1, d2], ignore_index=True)

   A    B    C  D
0  1  1.0  2.0  2
1  3  3.0  4.0  4
2  5  5.0  6.0  6
3  7  NaN  NaN  8
4  9  NaN  NaN  0

或者

d1.append(d2, ignore_index=True)

   A    B    C  D
0  1  1.0  2.0  2
1  3  3.0  4.0  4
2  5  5.0  6.0  6
3  7  NaN  NaN  8
4  9  NaN  NaN  0

我首选的方法是跳过重新分配名称

pd.concat(df1.align(df2, 'left', 1), ignore_index=True)

   A    B    C  D
0  1  1.0  2.0  2
1  3  3.0  4.0  4
2  5  5.0  6.0  6
3  7  NaN  NaN  8
4  9  NaN  NaN  0

答案 1 :(得分:4)

您可以使用查找df2concatappend上的列的交集:

pd.concat(
    [df1, df2[df1.columns.intersection(df2.columns)]]
)

或者,

df1.append(df2[df1.columns.intersection(df2.columns)])

   A    B    C  D
0  1  1.0  2.0  2
1  3  3.0  4.0  4
2  5  5.0  6.0  6
0  7  NaN  NaN  8
1  9  NaN  NaN  0

答案 2 :(得分:3)

你也可以使用reindex和concat:

pd.concat([df1,df2.reindex(columns=df1.columns)])
Out[81]: 
   A    B    C  D
0  1  1.0  2.0  2
1  3  3.0  4.0  4
2  5  5.0  6.0  6
0  7  NaN  NaN  8
1  9  NaN  NaN  0

答案 3 :(得分:0)

在合并之前先转置。

df1.T.merge(df2.T, how="left", left_index=True, right_index=True).T

    A   B   C   D
0_x 1.0 1.0 2.0 2.0
1_x 3.0 3.0 4.0 4.0
2   5.0 5.0 6.0 6.0
0_y 7.0 NaN NaN 8.0
1_y 9.0 NaN NaN 0.0

df1.T           df2.T

    0   1   2      1 2
A   1   3   5   A  7 9
B   1   3   5   E  7 9
C   2   4   6   D  8 0
D   2   4   6   F  8 0

现在可以通过与how="left"合并获得结果,我们通过传递left_index=Trueright_index=True将索引用作连接键。

df1.T.merge(df2.T, how="left", left_index=True, right_index=True)

    0_x 1_x 2   0_y 1_y
A   1   3   5   7.0 9.0
B   1   3   5   NaN NaN
C   2   4   6   NaN NaN
D   2   4   6   8.0 0.0