使用WHERE子句的JOIN的熊猫模拟

Kei*_*thx 4 python sql pandas

我正在python的pandas中加入两个数据帧(A和B).

目标是从B接收所有纯行(在A.client_id = B.client_id上的sql analogue- right join B,其中A.client_id为null)

在大熊猫中我所知道的这个操作是合并但我不知道如何设置条件(where子句):

x=pd.merge(A,B,how='right',on=['client_id','client_id']
Run Code Online (Sandbox Code Playgroud)

谢谢!

piR*_*red 7

选项1
indicator=True

A.merge(B, on='client_id', how='right', indicator=True) \
    .query('_merge == "right_only"').drop('_merge', 1)
Run Code Online (Sandbox Code Playgroud)

设置

A = pd.DataFrame(dict(client_id=[1, 2, 3], valueA=[4, 5, 6]))
B = pd.DataFrame(dict(client_id=[3, 4, 5], valueB=[7, 8, 9]))
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

更多说明
indicator=True在合并结果中放置另一列,指示行结果是来自左侧、右侧还是两者。

A.merge(B, on='client_id', how='outer', indicator=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,我只是用来query过滤掉right_only指标,然后删除该列。


选项2
并不是真正的合并。您可以query再次使用来仅拉出B'client_id's 不在的A

B.query('client_id not in @A.client_id')
Run Code Online (Sandbox Code Playgroud)

或者用同等的方式表达同样的事情(但更快)

B[~B.client_id.isin(A.client_id)]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Qui*_*2k1 5

对我来说,这也有点令人不满意,但我认为推荐的方式是这样的 A.where(A["client_ID"].isnull())

可以在pandas文档中找到更多信息

此外,您可能会使用类似None过滤的东西.另外,请注意我之前版本中的错误.我正在比较,isnull()但你应该使用该A.where(A["client_ID"].isnull())功能