我有两个数据帧正在尝试合并,但我没有使用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列的新数据框,而不是我想要的。关于如何实现这一目标的任何想法?谢谢!
答案 0 :(得分:6)
您希望使用pd.DataFrame.align
方法并指定您希望与left
参数的索引对齐,并且您只关心列。
d1, d2 = df1.align(df2, join='left', axis=1)
然后您可以使用pd.DataFrame.append
或pd.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)
您可以使用查找df2
和concat
或append
上的列的交集:
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=True
和right_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