如果两列在DFs中匹配,如何将两个DFs与python合并
df1是所有的案例 df2是一个完整的bca 如果两个dfs中的EFE/手动电子表格/通行证编号或实现日期匹配,则以下代码合并所有案例&所有bca(3列)如果两列在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'
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,您没有得到期望的结果吗?你能解释一下这个问题吗?它与任一列都匹配。不是两者都有