如何在python中实现左外连接?

如何在python中实现左外连接?,python,pandas,Python,Pandas,我一直在尝试在python中实现左外连接,我发现左连接和左外连接之间有细微的区别 与此链接一样: 我可以通过以下示例获得我的手: import pandas as pd import numpy as np df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': np.random.randn(4)}) df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'], 'value2': np.r

我一直在尝试在python中实现左外连接,我发现左连接和左外连接之间有细微的区别

与此链接一样:

我可以通过以下示例获得我的手:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value1': np.random.randn(4)})

df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'],
 'value2': np.random.randn(4)})

df3 = df1.merge(df2, on=['key'], how='left')
这将提供来自df1的全部记录(包括相交的记录)

但是我如何做左外连接,它只有来自df1的记录,而这些记录不在df2中

不是:这只是一个示例。我可能在两个数据帧中都有大量列(不同)

请提供帮助。

设置参数,这将添加一列
\u merge
,然后仅过滤
左侧的行。

In [46]:
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value1': np.random.randn(4)})
​
df2 = pd.DataFrame({'key': ['B', 'D', 'D', 'E'],
 'value2': np.random.randn(4)})
​
df3 = df1.merge(df2, on=['key'], how='left', indicator=True)
df3

Out[46]:
  key    value1    value2     _merge
0   A -0.346861       NaN  left_only
1   B  1.120739  0.558272       both
2   C  0.023881       NaN  left_only
3   D -0.598771 -0.823035       both
4   D -0.598771  0.369423       both

In [48]:
df3[df3['_merge'] == 'left_only']

Out[48]:
  key    value1  value2     _merge
0   A -0.346861     NaN  left_only
2   C  0.023881     NaN  left_only
如果在旧版本上,则使用
isin
~
来消除掩码:

In [50]:
df3[~df3['key'].isin(df2['key'])]

Out[50]:
  key    value1  value2
0   A -0.346861     NaN
2   C  0.023881     NaN

我使用的是旧版本的pandas,想不出这一点。谢谢。如果我仍然使用旧版本,还有其他选择吗?您可以使用
isin
~
来取消掩码,以过滤
df2
中的行,谢谢EdChum。这很有效!!如果我有一个以上的键,比如key1,key2,key3。df3[~df3[['key1','key2','key3']]。isin(df2[[['key1','key2','key3']])似乎缺少一些信息。当您开始引入排列时,这会更加复杂,除非您可以按行进行比较,这在这里非常困难。可能有效的一件事是将索引设置为两个dfs的所有三个键列,然后执行
df1.index.difference(df2.index)
这将返回df1中但不在df2中的行。请尝试并告知您。谢谢。