Индексация pandas: производительность и ловушки
Вопрос
Вы ревьюите ноутбук, где данные меняются в цикле for i in range(len(df)): df.loc[i, "x"] = .... Что скажете и как перепишете?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Каждый `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 ошибок.