2016-11-29 116 views
3

我正在加入兩個數據框(A和B)在Python的熊貓。熊貓模擬JOIN與WHERE子句

目標是選自B接收所有的純行(SQL analogue-右連接上A.client_id = B.client_id B其中A.client_id爲null)

在大熊貓都知道這樣的操作但我不知道如何設置條件(where子句):

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

謝謝!

+0

我想你在'on'參數中只需要一個'client_id'。如果您想加入多個列,請使用列表。使用'left_on'和'right_on'分別指定兩個數據幀的列。 – TheEspinosa

回答

2

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

結果

enter image description here

更多的解釋
indicator=True把另一列指示行結果是否是來自左,右,或兩者合併的結果。

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

enter image description here

所以,我只是用query濾除right_only指示器然後刪除該列。


選項2
不是一個真正的合併。您可以再次使用query只拉B行,其中其'client_id' s爲不A

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

或者說同樣的事情的等效方法(但速度更快)

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

enter image description here

3

對於我來說,這也是一個有點不滿意,但我想推薦的方式是一樣的東西x=pd.merge(A[A["client_ID"].isnull()],B,how='right',on=['client_id','client_id'])

更多信息,可以在pandas documentation

另外可以發現,你可以使用這樣的A.where(A["client_ID"].isnull())過濾。另外,請注意我之前版本中的錯誤。我比較None,但你應該使用isnull()功能