Найти тему
Властелин машин

Ловушка сэмлирования, приводящая к размножению повторных индексов

Рассмотрим пример проблемы, возникающей в результате неаккуратной работы с индексами Pandas объектов. Пусть имеются две взаимосвязанные колонки ser1, ser2. Допустим, нам надо сэмплировать несколько строк из первой серии и упорядочить строки второй серии в том же порядке:

-2

Как и ожидалось, появились повторяющиеся индексы. Обратите внимание на интересное поведение при обращении по ним:

-3

То есть при обращении по повторяющемуся индексу вы получите кратное количество всех его вхождений.

Пусть теперь надо из ser1_resampled выбрать n строк в позициях с наибольшими значениями в ser2_resampled. На первый взгляд кажутся применимыми следующие два подхода:

  • отсортировать ser2_resampled, затем выбрать индексы n первых строк и сделать выборку по ним;
  • отсортировать ser2_resampled, проиндексировать ser1_resampled по индексам ser2_resampled и потом выбрать n первых элементов.

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

-4

То есть вместо ожидаемых 6 строк получили 12. А во втором случае получится так:

-5

Оба варианта являются неправильными, так как у нас появились строки, отсутствовавшие в первоисточнике (например, стольких дублей троек не было). А корректно было сделать то же самое, только предварительно сбросив индексы:

-6
-7

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

-8

Наука
7 млн интересуются