Ответ вслух Senior Выборка и фильтрация обновлено

Индексация pandas: производительность и ловушки

Вопрос

Вы ревьюите ноутбук, где данные меняются в цикле for i in range(len(df)): df.loc[i, "x"] = .... Что скажете и как перепишете?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Скажу о двух проблемах. Первая, корректность: цикл идёт по позициям range(len(df)), а loc работает по меткам, после любого фильтра или сортировки индекс уже не 0..n-1, и код начнёт писать не туда или создавать новые строки.

Что должно прозвучать в ответе

  • Каждый `loc` в цикле дорогой: проверки индекса, выравнивание, возможное копирование

  • Цикл по позициям, а `loc` по меткам: после фильтра сломается

  • Переписать векторно: арифметика колонок, `np.where`, `np.select`, `map`

  • Если логика сложная: собрать список значений и присвоить колонку целиком

  • Если без цикла никак: `itertuples` или работа с `.to_numpy()`

  • Замерить: `%timeit` до и после

Что могут спросить следом

  • Почему iterrows медленный и меняет типы?
  • Когда apply с axis=1 допустим?
  • Как условно выбрать из пяти вариантов без цикла?

Разбор

Скажу о двух проблемах. Первая, корректность: цикл идёт по позициям range(len(df)), а loc работает по меткам, после любого фильтра или сортировки индекс уже не 0..n-1, и код начнёт писать не туда или создавать новые строки. Вторая, скорость: каждый вызов loc проходит через разбор индексатора и проверки, на сотнях тысяч строк это минуты вместо миллисекунд. Переписываю векторно: арифметика колонок, np.where для двух веток, np.select для нескольких, map для словаря соответствий. Если логика правда построчная и сложная, собираю значения в список и присваиваю колонку целиком один раз. Когда итерация неизбежна, беру itertuples или массивы из to_numpy(), но не iterrows: он медленный и приводит строку к одному типу. И обязательно замеряю %timeit до и после.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме