Используйте groupby
+ cumcount
для создания идентификатора группы для каждого DataFrame
Затем выполните слияние на основе этого и столбца A
dfa['gid'] = dfa.groupby('A').cumcount()
dfb['gid'] = dfb.sort_values('F', ascending=False).groupby('A').cumcount()
dfa.merge(dfb, on=['A', 'gid'], how='left')
Вывод:
A B C D E gid B_new F
0 x1 Apple 0.3 0.9 0.6 0 Apple 0.3
1 x1 Orange 0.1 0.5 0.2 1 Mango 0.2
2 x2 Apple 0.2 0.2 0.1 0 Orange 0.3
3 x2 Orange 0.3 0.4 0.9 1 Apple 0.2
4 x2 Mango 0.1 0.2 0.3 2 Mango 0.1
5 x3 Orange 0.3 0.1 0.2 0 Orange 0.3