如果两列在DFs中匹配,如何将两个DFs与python合并

如果两列在DFs中匹配,如何将两个DFs与python合并,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,df1是所有的案例 df2是一个完整的bca 如果两个dfs中的EFE/手动电子表格/通行证编号或实现日期匹配,则以下代码合并所有案例&所有bca(3列) cross = pd.merge(all_cases,\ all_bca[['EFE / Manual E-Form / Gate Pass No.','Realization Date','BCA(FC)',\ 'Foreign Bank Charges'

df1是所有的案例

df2是一个完整的bca

如果两个dfs中的EFE/手动电子表格/通行证编号或实现日期匹配,则以下代码合并所有案例&所有bca(3列)

cross = pd.merge(all_cases,\
                 all_bca[['EFE / Manual E-Form / Gate Pass No.','Realization Date','BCA(FC)',\
                          'Foreign Bank Charges','Agent/Brokerage Commision'
]], on=('EFE / Manual E-Form / Gate Pass No.','Realization Date'), how='left')
如果两列都匹配,我想合并。我该怎么做呢

所有个案

EFE / Manual E-Form / Gate Pass No.    Realization Date      
123456                                 1/1/2019         
789654                                 2/18/2019                    
852147                                 1/3/2018             
93258                                  1/4/2019           

一切都好

EFE / ......    Realization Date      BCA(FC)     Charges       Commision
123456             8/1/2019           88           8               8
789654             2/18/2019          300          30              10
852147             1/3/2018           500          25              20
93258              1/4/2019           1000         20              30
2530245            1/1/2019           333          33              33

期望结果

EFE     Realization Date    BCA(FC)     Charges   Commision    Check 
123456     1/1/2019              -         -           -        Not Match
789654     2/18/2019             300       30          10        Match       
852147     1/3/2018              500       25          20        Match
93258      1/4/2019              -          -           -       Not Match


电流输出

EFE     Realization Date  BCA(FC)  Charges Commision  Check 
123456  1/1/2019              88     8         8       Match
789654  2/18/2019            300     30       10       Match
852147  1/3/2018             500     25       20       Match    
93258   1/4/2019             1000    20       30       Match   

使用带有默认内部联接的pd.merge

all_cases = pd.DataFrame([['123456','1/1/2019'],['789654','2/18/2019'],['852147','1/3/2018'],['93258','1/4/2019 ']],
                      columns=['EFE / Manual E-Form / Gate Pass No.','Realization Date'])
all_bca = pd.DataFrame([['123456','8/1/2019','88','8','8'],
                        ['789654','2/18/2019','300','30','10'],
                        ['852147','1/3/2018','500','25','20'],
                        ['93258','1/4/2019','1000','20','30'],
                        ['2530245','1/1/2019','333','33','33']],
                      columns=['EFE / Manual E-Form / Gate Pass No.','Realization Date','BCA(FC)','Charges','Commision'])
cross = all_cases.merge(all_bca, 
                        on=['EFE / Manual E-Form / Gate Pass No.','Realization Date'],
                        how='inner')
print(cross)
输出:

  EFE / Manual E-Form / Gate Pass No. Realization Date  ... Charges Commision
0                              789654        2/18/2019  ...      30        10
1                              852147         1/3/2018  ...      25        20

[2 rows x 5 columns]
  EFE / Manual E-Form / Gate Pass No. Realization Date  ... Commision       check
0                              789654        2/18/2019  ...        10        both
1                              852147         1/3/2018  ...        20        both
2                              123456         8/1/2019  ...         8  right_only
3                               93258         1/4/2019  ...        30  right_only
4                             2530245         1/1/2019  ...        33  right_only

[5 rows x 6 columns]
EDIT1:

如果要保留所有案例,请尝试以下方法:

cross = all_cases.merge(all_bca,
                        on=['EFE / Manual E-Form / Gate Pass No.','Realization Date'],
                        how='right',
                        indicator='check')
print(cross)
输出:

  EFE / Manual E-Form / Gate Pass No. Realization Date  ... Charges Commision
0                              789654        2/18/2019  ...      30        10
1                              852147         1/3/2018  ...      25        20

[2 rows x 5 columns]
  EFE / Manual E-Form / Gate Pass No. Realization Date  ... Commision       check
0                              789654        2/18/2019  ...        10        both
1                              852147         1/3/2018  ...        20        both
2                              123456         8/1/2019  ...         8  right_only
3                               93258         1/4/2019  ...        30  right_only
4                             2530245         1/1/2019  ...        33  right_only

[5 rows x 6 columns]

check=='both'的行是匹配的行

请提供一些示例输入数据我的结果告诉其他人在
merge()
函数的
on=
子句中,您应该使用
[]
传递列列表,而不是
()
。我希望保留df1中的所有行,即所有情况。它会保留吗?问题是什么persists@HusnainIqbal请参见上面的EDIT1,您没有得到期望的结果吗?你能解释一下这个问题吗?它与任一列都匹配。不是两者都有