【问题标题】:How do I merge two DFs with python if two columns match across DFs如果两列跨 DF 匹配,我如何将两个 DF 与 python 合并
【发布时间】:2019-12-04 06:22:14
【问题描述】:

df1 是 all_cases

df2 是 all_bca

如果 EFE / Manual E-Form / Gate Pass No.Realization Date 在两个 dfs 中匹配,则以下代码合并 all_casesall_bca(3 columns)

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           

all_bca

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   

【问题讨论】:

  • 请提供一些示例输入数据
  • 我的结果不是这样
  • merge() 函数的on= 子句中,您应该使用[] 来传递列列表,而不是()

标签: python pandas dataframe merge


【解决方案1】:

使用带有默认内部连接的 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]

EDIT1:

如果您想保留 all_cases,请尝试以下操作:

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  ... 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' 的行是匹配的行

【讨论】:

  • 我想保留 df1 中的所有行,即 all_cases。会保留吗?
  • 问题依旧
  • @HusnainIqbal 请参阅上面的 EDIT1
  • 您没有得到想要的结果吗?你能解释一下这个问题吗?
  • 匹配任一列。不是两者都
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多