根据多个条件加入两个熊猫数据框
Posted
技术标签:
【中文标题】根据多个条件加入两个熊猫数据框【英文标题】:Joining two pandas dataframes based on multiple conditions 【发布时间】:2019-05-02 03:13:37 【问题描述】:df_a
和 df_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_a['A'] == df_b['A']
和df_a['B'] == df_b['B_new']
的独特组合。
我已尝试进行外部联接,然后删除重复的 w.r.t 列 A 和 B 到 final_df
,但 B_new 的值没有保留。
以下是我希望我的result_df
的样子:
结果_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_a
和df_b
的联合,这不是我想要的。
感谢任何建议。
【问题讨论】:
【参考方案1】:您需要一个内部合并,在每种情况下指定两个合并列:
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
【讨论】:
【参考方案2】:您仍然可以通过非常理想的左连接来实现这一点。 见下文:
final_df = pd.merge(df_a, df_b[['A', 'B_new','F']], how="left", left_on=['A', 'B'], right_on=['A', 'B_new']);
【讨论】:
以上是关于根据多个条件加入两个熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章