Ответ 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
, чьи базовые реализации также используют быстрый поиск индекса.
Итак, в конце концов, я думаю, что начало полезности индекса, почему оно проявляется во множестве функций, связано с его способностью выполнять быстрый хэш поиски.