Давайте просто протестируем его с поддельными данными:
import pandas as pd
import numpy as np
# df1: 60k rows, not indexed
df1 = pd.DataFrame(data = {'a': np.random.randint(0, 100, 60_000),
'b': np.random.randint(0, 100, 60_000)})
# df2: 1k rows, indexed
df2 = pd.DataFrame(data = {'c': np.random.randint(0, 100, 1000)},
index = np.random.randint(0, 100, 1000))
Joins Performances
%timeit pd.merge(df1, df2, left_on='a', right_index=True, how='left')
55.4 ms ± 6.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.merge(df1.set_index('a'), df2, left_index=True, right_index=True,
how='left')
49.8 ms ± 3.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Это уже показывает лучшую производительность при присоединении к индексу. Однако я также устанавливаю индекс в объединении, которое нужно сделать один раз, если у вас есть несколько объединений. Давайте посмотрим на время, разделенное между двумя операциями:
%time df1.set_index('a', inplace=True)
Wall time: 936 µs
%timeit pd.merge(df1, df2, left_index=True, right_index=True, how='left')
48 ms ± 3.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)