np.where(условие, значение_если_да, значение_если_нет) — векторный аналог тернарного if для целой колонки: возвращает одно значение там, где условие истинно, и другое — где ложно. Это быстрая замена apply с if внутри и pandas-аналог SQL CASE WHEN для одного условия. Для нескольких веток есть np.select.
np.where возвращает numpy-массив, а не Series — при присваивании в колонку это ок, но индекс теряется, поэтому не смешивай с операциями, где нужен индекс. np.select проверяет условия по порядку и берёт первое истинное — более узкие условия ставь выше. Не забудь default в np.select, иначе несопавшие строки получат 0 или мусор. Для одного условия — where, для многих — select.
Где спрашивают на собеседовании
np.where/np.select — стандартная замена медленного apply(lambda: if...) на собеседовании по производительности pandas. Просят «перепиши это условие векторно» или «сегментируй без apply». Ценят выбор where для бинарного и select для многоклассового условия.
FAQ: частые вопросы про np.where
Чем np.where лучше apply с if?
np.where считается векторно над всем массивом в C, а apply гоняет питоновскую функцию построчно. На больших данных where в десятки раз быстрее и читается короче.
Как сделать несколько условий вместо вложенных np.where?
np.select([условие1, условие2, ...], [значение1, значение2, ...], default=...) — проверяет условия по порядку и берёт значение первого истинного. Это чище, чем вложенные where.
Это аналог SQL CASE WHEN?
Да: np.where — для одного условия (как простой CASE), np.select — для нескольких веток (как многоусловный CASE WHEN ... THEN ... ELSE).