web-dev-qa-db-ja.com

2つのpandasデータフレームを複数の条件に基づいて結合する

df_adf_bは、次のような2つのデータフレームです

df_a
A   B       C      D     E
x1  Apple   0.3   0.9    0.6
x1  Orange  0.1   0.5    0.2
x2  Apple   0.2   0.2    0.1
x2  Orange  0.3   0.4    0.9
x2  Mango   0.1   0.2    0.3
x3  Orange  0.3   0.1    0.2


df_b
A   B_new   F    
x1  Apple   0.3  
x1  Mango   0.2  
x1  Orange  0.1   
x2  Apple   0.2   
x2  Orange  0.3     
x2  Mango   0.1  
x3  Orange  0.3  
x3  Mango   0.2  
x3  Apple   0.1  

final_dfに含まれるすべての行をdf_aに含めて、df_a['A'] == df_b['A']df_a['B'] == df_b['B_new']の一意の組み合わせを検討できるようにします。

外部結合を実行してから、重複するw.r.t列AおよびBをfinal_dfにドロップしようとしましたが、B_newの値は保持されません。

以下は、result_dfを次のようにする方法です。

result_df

 A   B       C      D     E   B_new  F
x1  Apple   0.3   0.9    0.6  Apple  0.3
x1  Orange  0.1   0.5    0.2  Orange 0.1
x2  Apple   0.2   0.2    0.1  Apple   0.2 
x2  Orange  0.3   0.4    0.9  Orange  0.3
x2  Mango   0.1   0.2    0.3  Mango   0.1
x3  Orange  0.3   0.1    0.2  Orange  0.3

左外部結合も試しました:

final_df = pd.merge(df_a, df_b, how="left", on=['A'])

このデータフレームのサイズはdf_adf_bの和集合ですが、これは私が望むものではありません。

提案を感謝します。

5
iprof0214

これは、非常に理想的な左結合で実現できます。
下記参照:

final_df = pd.merge(df_a, df_b[['A', 'B_new','F']], how="left", left_on=['A', 'B'], right_on=['A', 'B_new']);
0
Daniel