python - 如果两列跨 DF 匹配,我如何将两个 DF 与 python 合并
问题描述
df1 是 all_cases
df2 是 all_bca
以下代码合并all_cases和all_bca(3 列)如果两个 dfs 中的一个EFE / Manual E-Form / Gate Pass No.
或匹配。Realization Date
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')
如果两列都匹配,我想合并。我该怎么做。
all_cases
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
解决方案
使用带有默认内部连接的 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]
编辑1:
如果您想保留 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' 的行是匹配的行
推荐阅读
- java - 使用 Mockito 模拟接口时出现空指针异常
- angular - 如何操作表格内的角度材料复选框
- javascript - JS找到对象数组之间的区别
- python - OpenCV查找轮廓的中间线[Python]
- javascript - 如何将数组与打字稿中的对象映射
- css - 将多个 CSS @keyframes 动画锁定在一起
- python - 使用变量更改列表内容
- c++ - 握手失败,出现致命错误 SSL_ERROR_SSL: error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
- mysql - 对于单个数据库,每个网站都应该有不同的 MySQL 用户吗?
- python - Pandas:如何获取由另一列作为数据框分组的列上具有最大值的行