Особенности операций среза и индексации с использованием мультииндекса в Pandas

Что такое lexsort_depth в мультииндексе? Почему мультииндекс нужно сортировать для операций среза/индексации? Почему поиск по метке индекса может быть медленным?

Для правильной работы операций среза/индексации реализация MultiIndex предполагает, что метки индекса предварительно отсортированы (лексикографически). При попытке получить срез дейта-фрейма с использованием неотсортированных меток индекса, вы можете увидеть сообщения об ошибках. Например такие:

PerformanceWarning: indexing past lexsort depth may impact performance.

KeyError: 'Key length (1) was greater than MultiIndex lexsort depth (0)'

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (1)'

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

Если уровень индекса отсортирован, pandas задействует для поиска позиций возможности np.searchsorted() (реализация бинарного поиска). В противном случае используются другие (более медленные) методы.

Проверить количество уровней в мультииндексе, которые отсортированы лексикографически, можно с помощью свойства lexsort_depth. Если обнаружили несоответствие и необходима сортировка, pandas предлагает несколько способов, в том числе методы дейта-фрейма sort_index() и sortlevel(). На мой взгляд, проще всего sort_index(). Он группирует метки оси и сортирует их согласно первоначальному порядку сортировки связанного с ним фактора на данном уровне. В конечном счете мы получаем лексикографически отсортированные метки и возможность быстро выполнять операции среза/индексации.