根据多个条件连接两个熊猫数据框

时间:2018-11-30 00:17:48

标签: python pandas dataframe

df_adf_b是两个看起来像下面的数据框

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_b中A和B == A和B_new的唯一组合。

我尝试进行外部联接,然后在final_df中删除带有列A和B的重复项,但未保留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的并集,这不是我想要的。

赞赏任何建议。

2 个答案:

答案 0 :(得分:0)

您需要一个内部合并,在每种情况下都指定两个 合并列:

res = df_a.merge(df_b, how='inner', left_on=['A', 'B'], right_on=['A', 'B_new'])

print(res)

    A       B    C    D    E   B_new    F
0  x1   Apple  0.3  0.9  0.6   Apple  0.3
1  x1  Orange  0.1  0.5  0.2  Orange  0.1
2  x2   Apple  0.2  0.2  0.1   Apple  0.2
3  x2  Orange  0.3  0.4  0.9  Orange  0.3
4  x2   Mango  0.1  0.2  0.3   Mango  0.1
5  x3  Orange  0.3  0.1  0.2  Orange  0.3

答案 1 :(得分:0)

您仍然可以通过非常理想的左连接来实现这一目标。
见下文:

['is', 'and', 'I', 'email', 'address', 'is']