Добавить в корзинуПозвонить
Найти в Дзене
Властелин машин

Прожорливость индексов датафрейма, о которой следует знать каждому

Несколько простых рекомендаций работы с индексами датафрейма помогут сэкономить значительную часть памяти и, возможно, приведут к повышению скорости его обработки. Создадим два датафрейма и посмотрим, какие индексы для них создает система: Конструкция RangeIndex обозначает границы индекса и шаг. Она предназначена для экономии памяти и ускорения работы с датафреймом. Однако, если создавать индексы вручную и проводить с ними операции система создает более тяжеловесную конструкцию Int64Index и др. Например, вот индекс после конкатенации наших массивов: Если мы создадим аналогичные индексы сами, все равно получим Int64Index. При этом, даже если они будут идти последовательно, при конкатенации не будет присвоен RangeIndex: А вот индекс можно сбросить и так получить конструкцию RangeIndex: Того же эффекта можно достичь при конкатенации, если в методе указать параметр ignore_index=True: Теперь сгенерируем большие датафреймы и посмотрим, как влияет тип индекса на память: Если же конкатенироват

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

Создадим два датафрейма и посмотрим, какие индексы для них создает система:

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

Например, вот индекс после конкатенации наших массивов:

-2

Если мы создадим аналогичные индексы сами, все равно получим Int64Index. При этом, даже если они будут идти последовательно, при конкатенации не будет присвоен RangeIndex:

-3
-4

А вот индекс можно сбросить и так получить конструкцию RangeIndex:

-5

Того же эффекта можно достичь при конкатенации, если в методе указать параметр ignore_index=True:

-6

Теперь сгенерируем большие датафреймы и посмотрим, как влияет тип индекса на память:

-7

Если же конкатенировать с ignore_index=True:

-8

Почти вся разница (150-160 МБ) - это вклад размера индекса:

-9

Особо хочу отметить, что даже сжатие в популярный формат parquet очень слабо влияет на размер индекса:

-10

Хоть разница сократилась, она достаточно велика - 80 МБ, в то же время сам датафрейм стал весить чуть более 50 МБ. То есть индекс занимает почти в 2 раза больше места, чем сам датафрейм!

Выводы, если значения индекса вам не принципиальны:

не задавайте его вручную;

время от времени делайте reset_index;

при конкатенации используйте флаг ignore_index=True.

-11