簡體   English   中英

帶有 WHERE 子句的 JOIN 的 Pandas 模擬

[英]Pandas analogue of JOIN with WHERE clause

我正在 python 的熊貓中加入兩個數據框(A 和 B)。

目標是從 B 接收所有純行(sql 模擬-在 A.client_id=B.client_id 上右連接 B,其中 A.client_id 為空)

在 Pandas 中,我只知道這個操作是進行合並,但我不知道如何設置條件(where 子句):

x=pd.merge(A,B,how='right',on=['client_id','client_id']

對我來說,這也有點不盡如人意,但我認為推薦的方式是這樣的:

x = pd.merge(A[A["client_ID"].isnull()], B, 
             how='right', on=['client_id', 'client_id'])

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

此外,您可能會使用A.where(A["client_ID"].isnull())進行過濾。 另外,請注意我在以前版本中的錯誤。 我正在與None進行比較,但您應該使用isnull()函數

選項 1
indicator=True

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

設置

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]))

結果

在此處輸入圖片說明

更多解釋
indicator=True將另一列放在合並的結果中,指示該行結果是來自左側、右側還是兩者兼而有之。

A.merge(B, on='client_id', how='outer', indicator=True)

在此處輸入圖片說明

所以,我只是使用query來過濾掉right_only指標,然后刪除該列。


選項 2
不是真正的合並。 您可以再次使用query來僅提取B'client_id'不在A

B.query('client_id not in @A.client_id')

或者說同樣的事情的等價方式(但更快)

B[~B.client_id.isin(A.client_id)]

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM