Панды отбрасывают строки против фильтра - PullRequest
0 голосов
/ 05 июня 2018

У меня есть фрейм данных pandas, и я хочу избавиться от строк, в которых столбец «A» является отрицательным.Я знаю 2 способа сделать это:

df = df[df['A'] >= 0]

или

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

Какое рекомендуемое решение?Почему?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Рекомендованное решение является наиболее эффективным, которое в данном случае является первым.

df = df[df['A'] >= 0]

Во втором решении

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

вы повторяете процесс нарезки.Но давайте разберем его на части, чтобы понять, почему.

Когда вы пишете

df['A'] >= 0

, вы создаете маску, логическую серию с записью для каждого индекса df, значение которой равноВерно или неверно в соответствии с условием (в этом случае, если значение столбца «А» для данного индекса больше или равно 0).

Когда вы пишете

df[df['A'] >= 0]

вы получаете доступ к строкам, для которых ваша маска (df ['A']> = 0) имеет значение True.Это метод нарезки, поддерживаемый Pandas, который позволяет вам выбирать определенные строки, передавая логическую серию, и возвращает новый DataFrame только с записями, для которых эта серия была истинной.

Наконец, когда вы пишете это

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

вы повторяете процесс, потому что

df[df['A'] < 0]

уже нарезает ваш DataFrame (в данном случае для строк, которые вы хотите drop ).Затем вы получаете эти индексы, возвращаетесь к исходному DataFrame и явно отбрасываете их.Нет необходимости в этом, вы уже нарезали DataFrame на первом шаге.

0 голосов
/ 07 марта 2019
df = df[df['A'] >= 0]

действительно более быстрое решение.Просто имейте в виду, что он возвращает представление исходного фрейма данных, а не новый фрейм данных.Это может привести к неприятностям, например, когда вы захотите изменить его значения, поскольку pandas даст вам SettingwithCopyWarning.

. Простое исправление, конечно, то, что рекомендовал Вэнь-Бен:

df = df[df['A'] >= 0].copy()
0 голосов
/ 05 июня 2018

Ваш вопрос такой: «У меня два одинаковых торта, но у одного есть глазурь. В которой больше калорий?»

Второе решение - это то же самое, но дважды.Достаточно шага фильтрации, нет необходимости фильтровать и , а затем избыточно переходит к вызову функции, которая выполняет ту же функцию, что и операция фильтрации из предыдущего шага.

Чтобы уточнить: независимоэтой операции вы все еще делаете то же самое: генерируете логическую маску и затем последовательно индексируете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...