我正在加入兩個數據框(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']
謝謝!
我正在加入兩個數據框(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']
謝謝!
選項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'
s爲不A
B.query('client_id not in @A.client_id')
或者說同樣的事情的等效方法(但速度更快)
B[~B.client_id.isin(A.client_id)]
對於我來說,這也是一個有點不滿意,但我想推薦的方式是一樣的東西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()
功能
我想你在'on'參數中只需要一個'client_id'。如果您想加入多個列,請使用列表。使用'left_on'和'right_on'分別指定兩個數據幀的列。 – TheEspinosa