Нужна ли левая таблица, индексированная для эффективности, когда левая объединяется с другим проиндексированным DataFrame? - PullRequest
0 голосов
/ 17 января 2020

Я хочу сделать влево объединить , чтобы объединить два pandas DataFrame:

merged_df = left_df.merge(right_df, how='left', left_on='id', right_index=True)

left_df не индексируется, он имеет только id, но right_df индексируется . Я не индексировал left_df, поскольку он непрерывно меняется, но для слияния будет быстрее, если левый DataFrame также будет проиндексирован? В моем случае слияние выполняется очень часто, и до сих пор левый DataFrames имеет до 60 тыс. строк и правее до 1000.

Я не проверял pandas 'merge код, но, поскольку в левом слиянии он сохраняет все строки левого DataFrame Я не уверен, что индексирование увеличит скорость этого слияния.

1 Ответ

1 голос
/ 17 января 2020

Давайте просто протестируем его с поддельными данными:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...