Как фильтровать DataFrame без сюрпризов
Вопрос
Расскажите, как вы фильтруете DataFrame по сложным условиям и меняете значения по условию. Какие ошибки встречали?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Булева маска через `&`, `|`, `~` и скобки
`isin`, `between`, `str.contains`, `query` для читаемости
Изменение по условию одним шагом через `loc[маска, колонка]`
Цепочное присваивание не работает при Copy-on-Write
NaN даёт False в любом сравнении, отрицание маски тащит пропуски
После фильтра индекс с дырами: iloc против loc, `reset_index(drop=True)`
Что могут спросить следом
- Почему
andвместо&падает? - Чем
queryлучше или хуже маски? - Как условно задать значение из трёх вариантов?
Разбор
Фильтр строю булевой маской: условия в скобках, связываю &, |, отрицаю ~. Для частых случаев есть готовые методы: isin для списка значений, between для диапазона (границы включаются), str.contains для подстроки с na=False. Длинные условия иногда пишу в query, там можно сослаться на переменную через @. Значения по условию меняю одним вызовом df.loc[mask, "col"] = value, а для нескольких веток беру np.select или np.where. Ошибки, которые встречал: цепочное присваивание, которое в pandas 3.0 молча ничего не меняет; пропуски, которые после ~ неожиданно попадают в выборку, поэтому решаю судьбу NaN явно; и путаница loc и iloc после фильтра, когда индекс уже с дырами. Если дальше нужна позиционная работа, делаю reset_index(drop=True).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Переменная внутри query
Следующий вопрос
Индексация pandas: производительность и ловушки