Если я правильно понимаю, вы хотите объединить индексы без сортировки:
result = df1.join(df2.drop(columns=['col_1', 'col_2', 'col_3']), lsuffix='x', rsuffix='y', sort=False)
print(result)
Выход:
col_1 col_2 col_3 col_4x col_4y col_5
0 a x NaN 54 14 14
1 a y 5 34 9 7
2 b z NaN 64 51 53
3 c z 7 23 87 66
В противном случае простое слияние первых трех столбцов, опять же без сортировки, сделает:
result = df1.merge(df2, on=['col_1', 'col_2', 'col_3'], sort=False)
print(result)
Выход:
col_1 col_2 col_3 col_4_x col_4_y col_5
0 a x NaN 54 14 14
1 a y 5 34 87 66
2 b z NaN 64 9 7
3 c z 7 23 51 53