Выбор ответа Senior Производительность и память спрашивают часто обновлено

Цепочное присваивание в pandas 3.0

Вопрос

Код df[df["status"] == "test"]["amount"] = 0 не обнулил суммы. Как правильно?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: df.loc[df["status"] == "test", "amount"] = 0. Присвоение должно быть одной операцией над исходной таблицей: loc[маска, колонка].

Варианты ответа

  1. df.loc[df["status"] == "test", "amount"] = 0правильный ответ
  2. df[df["status"] == "test"]["amount"].fillna(0)
  3. Добавить .copy() в середину цепочки
  4. Включить pd.options.mode.chained_assignment = None

Разбор

Присвоение должно быть одной операцией над исходной таблицей: loc[маска, колонка]. Цепочка из фильтра и выбора колонки создаёт промежуточный объект, и в pandas 3.0 с Copy-on-Write запись в него никогда не доходит до df. copy() в середине цепочки тоже меняет только копию. Отключение опции лишь глушит предупреждение в старых версиях, а fillna тут вообще ни при чём.

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

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