2016-11-29 10 views
3

私はPythonのパンダで2つのデータフレーム(AとB)を結合しています。この操作のためのパンダでJOINのWHERE句と類似のパンダ

目標はBからのすべての純粋な行を受け取る(SQL analogue-右A.client_idがnull A.client_id = B.client_idにBを結合)することである

私が知っているすべてのさ合併を行うが、条件を設定する方法がわからない(where句):

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

ありがとう!

+0

Bの行を引くに再びqueryを使用することができます私は 'on'引数の中にただ一つの 'client_id'しか必要ないと思います。複数の列を結合する場合は、リストを使用します。 2つのデータフレームの列を別々に指定するには、 '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])) 
isnull()機能を使用する必要があります

結果

enter image description here

以上説明
indicator=True両方または、右、その行の結果が、左からのものであるかどうかを示すマージの結果に別の列を置きます。

enter image description here

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

だから、私はちょうどその列を削除 right_only指標をフィルタリングするために queryを使用しています。


本当に
ないマージオプション2。あなたはその'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

私にとって、これはまた少し不満足ですが、私はお勧めの方法は、より多くの情報がさらにpandas documentation

で見つけることができ

x=pd.merge(A[A["client_ID"].isnull()],B,how='right',on=['client_id','client_id'])のようなもので、あなたがフィルタリングに A.where(A["client_ID"].isnull())ようなものを使用するかもしれないと思います。また、私の前のバージョンでの間違いに注意してください。私は Noneと比較していますが、

関連する問題