Метод Pandas .loc() с использованием операторов «not» и «in» [дубликат]Python

Программы на Python
Anonymous
Метод Pandas .loc() с использованием операторов «not» и «in» [дубликат]

Сообщение Anonymous »


У меня есть фрейм данных, и я хочу удалить некоторые строки, если их значение не равно некоторым значениям, которые я сохранил в списке.

Итак, у меня есть переменная списка, в которой указаны значения объектов, которые я хочу сохранить:

allowed_values ​​= ["value1", "value2", "value3"] И я пытаюсь удалить строки из моего фрейма данных, если определенный столбец не содержит ни одного из разрешенных_значений. Сначала я использовал цикл for и оператор if следующим образом:

для индекса, строка в df.iterrows(): если строка["Тип"] не указана в разрешенных_значениях: # удалить строку, собирался узнать, как это сделать, но потом узнал о методе `.loc()` и подумал, что лучше использовать его. Итак, используя метод .loc(), я могу сделать что-то вроде этого, чтобы сохранять только объекты, у которых значение Type равно value1:

df = df.loc[df["Type"] == "value1"] Но я хочу сохранить все объекты, имеющие Type, в списке allowed_values. Я пытался сделать это:

df = df.loc[df["Тип"] в разрешенных_значениях] но это выдает следующую ошибку:

ValueError: истинное значение серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all(). Я ожидаю, что это по-прежнему будет работать, поскольку использование операторов in или комбинации операторов not in по-прежнему приводит к логическому значению, поэтому я не уверен, почему not in метод code>.loc() не поддерживает эти операторы.

Что именно не так с использованием операторов in или not в методе .loc() и как я могу создать логический оператор, который будут удалять строки, если их значение Type отсутствует в списке allowed_values?

РЕДАКТИРОВАТЬ: я обнаружил, что этот вопрос задает ту же ошибку, что и я, и ответ заключался в том, что вам нужно использовать только побитовые операторы (например, ==, !=, &, | и т. д.), а также not и in не являются побитовыми операторами и требуют чего-то, называемого «истинными значениями». Поэтому я думаю, что единственный способ получить желаемую функциональность — это просто использовать длинный поразрядный логический оператор, например:

df = df.loc[(df["Type"] == "value1") | (df["Тип"] == "значение2") | (df["Тип"] == "значение3")] Нет ли другого способа проверить, есть ли каждое значение в списке allowed_values? Это сделало бы мой код намного аккуратнее (у меня в списке более трех значений, поэтому это длинная строка).

Вернуться в «Python»