Как корректно проставить значение 1 в столбец flag для строк, где x > 0, чтобы не получить предупреждение SettingWithCopyWarning и не зависеть от копирования среза?
A
df[df['x'] > 0]['flag'] = 1 через двойную индексацию со срезом по условиюB
df.loc[df['x'] > 0, 'flag'] = 1 через выбор строк и столбца за один шаг по .locC
for i in range(len(df)): df.loc[i, 'flag'] = int(df.loc[i, 'x'] > 0) циклом по строкамD
df['flag'] = 1; df = df[df['x'] > 0] через пометку всех строк и фильтрацию копииПравильный ответ. Для безопасного присваивания по условию используйте
.loc[условие, столбец] = ....Разбор
Выражение вида df[условие]["col"] = ... создаёт промежуточный объект и может изменить копию, а не исходный DataFrame, что приводит к предупреждению SettingWithCopyWarning и потенциальным ошибкам. Идиоматичный и надёжный способ — df.loc[условие, "col"] = значение: за один шаг выбираются нужные строки и столбец, и присваивание выполняется на исходном объекте. Цикл по строкам сработает, но это очень медленно на больших данных. Вариант с предварительной пометкой всех строк и последующей фильтрацией ломает исходную задачу: он меняет содержимое всего набора, а не только подмножества.
Проверь себя · 1/3разбор после ответа
Что верно про вызов
pd.merge(orders, customers, on="customer_id", how="left")?Ещё вопросы по теме «Pandas и DataFrame»
- Что вернёт выражение `df[df["price"] > 100]`?
- В `DataFrame` `df` есть столбцы `country`, `user_id`, `revenue`. Что вернёт выражение `df.loc[df["country"] == "RU", ["user_id", "revenue"]]`?
- В `df` есть столбец `age`. Какие значения `age` попадут в результат `df[(df["age"] >= 18) & (df["age"] <= 25)]`?
- Что выберет фильтр `df[~df["status"].isin(["cancelled", "returned"])]`?
- Что верно про два шага: `mask = df["col"] > 0` и затем `df[mask]`?
- Все вопросы по «Pandas и DataFrame» →