Какова точка индексации в pandas?

Может ли кто-нибудь указать мне ссылку или дать объяснение преимуществ индексации в pandas? Я регулярно обрабатываю таблицы и присоединяюсь к ним на основе столбцов, и этот процесс присоединения/слияния, по-видимому, все-таки переиндексирует, поэтому довольно сложно применять критерии индекса, учитывая, что я не думаю, что мне нужно.

Любые мысли о лучших методах индексирования?

Ответы

Ответ 1

Как и dict, индекс DataFrame поддерживается хэш-таблицей. Поиск строк основанный на значениях индекса, похож на поиск значений dict на основе ключа.

В отличие от этого значения в столбце соответствуют значениям в списке.

Поиск строк на основе значений индекса быстрее, чем поиск строк на основе значений столбцов.

Например, рассмотрим

df = pd.DataFrame({'foo':np.random.random(), 'index':range(10000)})
df_with_index = df.set_index(['index'])

Вот как вы могли бы искать любую строку, где столбец df['index'] равен 999. Pandas должно пройти через каждое значение в столбце, чтобы найти те, которые равны 999.

df[df['index'] == 999]

#           foo  index
# 999  0.375489    999

Вот как вы можете искать любую строку, где индекс равен 999. С индексом Pandas использует хеш-значение для поиска строк:

df_with_index.loc[999]
# foo        0.375489
# index    999.000000
# Name: 999, dtype: float64

Поиск строк по индексу намного быстрее, чем поиск строк по значению столбца:

In [254]: %timeit df[df['index'] == 999]
1000 loops, best of 3: 368 µs per loop

In [255]: %timeit df_with_index.loc[999]
10000 loops, best of 3: 57.7 µs per loop

Обратите внимание, что для построения индекса требуется время:

In [220]: %timeit df.set_index(['index'])
1000 loops, best of 3: 330 µs per loop

Таким образом, наличие индекса выгодно только тогда, когда у вас есть много запросов такого типа для выполнения.

Иногда индекс играет роль в изменении формы DataFrame. Многие функции, такие как set_index, stack, unstack, pivot, pivot_table, melt, lreshape и crosstab, все используют индекс или обрабатывают его. Иногда мы хотим, чтобы DataFrame был в другой форме для целей презентации или для операций join, merge или groupby. (Как вы заметите, объединение также может быть выполнено на основе значений столбцов, но объединение на основе индекса происходит быстрее.) За кулисами join, merge и groupby используют быстрый поиск по индексу, когда это возможно.

Временные ряды имеют методы resample, asfreq и interpolate, чьи базовые реализации также используют быстрый поиск индекса.

Итак, в конце концов, я думаю, что начало полезности индекса, почему оно проявляется во множестве функций, связано с его способностью выполнять быстрый хэш поиски.