2017-05-11 8 views
2

検索していて、この質問に対する答えが見つからない場合は、ORロジックを使用してpandasデータフレームをマージできますか?基本的には、 "where t1.A = t2.A OR t1.A = t2.B"を使用したSQLマージに相当します。Python pandasがORロジックとマージする

私は、あるデータベースの情報をデータフレーム(df1)にプルする状況があります。別のデータフレーム(df2)に引っ張った別のデータベースの情報とマージして、単一の列に基づいてマージする必要があります(col1)。これらが一致したときに常に同じ値を使用していれば、それは非常に簡単です。私が持っている状況は時には彼らが合っていると時々彼らは同義語を使用することです。 3番目のデータベースには、このデータエンティティ(col1とcol1_alias)のシノニム間のルックアップを提供するテーブルがあり、3番目のデータフレーム(df3)にプルすることができます。私が探しているのは、df1から必要な列とdf2から必要な列を結合することです。

例df1.col1とdf2.col1試合で、これはうまくいく、上述のように...

df = df1.merge(df2, on='col1', how='left') 

しかし、彼らは常に同じ値を持ち、時には同義語を持っていません。私はdf3.col1がdf1.col1にあったか、df3.col1_aliasがdf1.col1にあったかに基づいてdf3を作成することを考えました。次に、df3.col1とdf3.col1_alias(list1)から値の単一のリストを作成し、list1のdf2.col1に基づいてdf2を選択します。これは私に必要なdf2の行を与えてくれるが、それでも適切な行と一致するdf1とdf2をマージすることはできない。私はそこORオプションをマージするならば、私はこれをステップ実行し、それを動作させることができると思うが、以下のすべての構文エラーを投げた:

df = df1.merge((df3, left_on='col1', right_on='col1', how='left')|(df3, left_on='col1', right_on='col1_alias', how='left')) 

df = df1.merge(df3, (left_on='col1', right_on='col1')|(left_on='col1', right_on='col1_alias'), how='left') 

df = df1.merge(df3, left_on='col1', right_on='col1'|right_on='col1_alias', how='left') 

など、いくつかのバリエーションがあります。 df3の2つの列の同義語を使用してdf1とdf2をマージするまったく異なるアプローチでORマージまたは提案を実行する方法に関するガイダンスはありますか?

答えて

0
#will this work? 
df = pd.concat([df1.merge(df3, left_on='col1', right_on='col1', how='left'), df1.merge(df3, left_on='col1', right_on='col1_alias', how='left')] 
+0

私はしないでください両方のマージ列が1つの行と一致することが望ましい場合は、IIUC以来、ここではconcatが_quite_であると考えます。 –

0

は、私は私は2つのマージとしてこれを行うだろうと思う: - > D = 7ではなくB = 2 - > D = 8

あなたが見ることができるように

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=["A", "B"]) 

In [12]: df2 = pd.DataFrame([[1, 7], [2, 8], [4, 9]], columns=["C", "D"]) 

In [13]: res = df.merge(df2, left_on="B", right_on="C", how="left") 

In [14]: res.update(df.merge(df2, left_on="A", right_on="C", how="left")) 

In [15]: res 
Out[15]: 
    A B C D 
0 1 2 1.0 7.0 
1 3 4 4.0 9.0 
2 5 6 NaN NaN 

このA = 1を選びます

注:彼らはこの例では両方とも同じだが、より拡張性(異なる列に一致する)ためには、単一の列を引き出しても意味があります:

In [21]: res = df.merge(df2, left_on="B", right_on="C", how="left")["C"] 

In [22]: res.update(df.merge(df2, left_on="A", right_on="C", how="left")["C"]) 

In [23]: res 
Out[23]: 
0 1.0 
1 4.0 
2 NaN 
Name: C, dtype: float64 
+0

ありがとうございました!間違いなくこれを行ってくれますか? – stlouismv

関連する問題