Python 将新dataframe添加到现有数据库,但仅在列名匹配时添加
我有两个数据帧,我正试图结合,但我没有得到我想要的结果使用pandas.concat 我有一个数据库的数据,我想添加新的数据,但只有当列的名称匹配 假设df1是:Python 将新dataframe添加到现有数据库,但仅在列名匹配时添加,python,pandas,dataframe,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.conca
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,而不是我想要的。我有什么办法可以做到这一点吗?谢谢 您希望使用该方法并指定要与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
或
我更喜欢的方式是跳过对姓名的重新分配
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
您可以使用查找
df2
和concat
或append
上列的交点:
pd.concat(
[df1, df2[df1.columns.intersection(df2.columns)]]
)
或者
您还可以使用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
合并前先转置
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\u index=True
和right\u 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
哇,太棒了!超级简单,完全符合我的要求,谢谢!
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
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
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