Выбор ответа Senior Производительность и память спрашивают часто обновлено
Цепочное присваивание в pandas 3.0
Вопрос
Код df[df["status"] == "test"]["amount"] = 0 не обнулил суммы. Как правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: df.loc[df["status"] == "test", "amount"] = 0. Присвоение должно быть одной операцией над исходной таблицей: loc[маска, колонка].
Варианты ответа
df.loc[df["status"] == "test", "amount"] = 0правильный ответdf[df["status"] == "test"]["amount"].fillna(0)- Добавить
.copy()в середину цепочки - Включить
pd.options.mode.chained_assignment = None
Разбор
Присвоение должно быть одной операцией над исходной таблицей: loc[маска, колонка]. Цепочка из фильтра и выбора колонки создаёт промежуточный объект, и в pandas 3.0 с Copy-on-Write запись в него никогда не доходит до df. copy() в середине цепочки тоже меняет только копию. Отключение опции лишь глушит предупреждение в старых версиях, а fillna тут вообще ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Производительность и память»
- Чем заменить apply(axis=1)
- Скидка по категории через map
- Категории сумм через np.select
- Ужать DataFrame: category и downcast
- category теряется при concat
- Copy-on-Write в pandas 3.0
- Copy-on-Write: изменение колонки
- Copy-on-Write и SettingWithCopyWarning