Как удалить строки из фрейма данных pandas на основе условного выражения



у меня есть фрейм данных pandas, и я хочу удалить строки из него, где длина строки в определенном столбце больше 2. Я знаю, что могу использовать df.dropna() чтобы избавиться от строк, которые содержат какие-либо NaN, но я не вижу как удалить строки на основе условного выражения.

ответ на этот вопрос кажется очень близко к тому, что я хочу ... кажется, я должен быть в состоянии сделать что-то вроде этого:

df[(len(df['column name']) < 2)]

но я просто получить ошибка:

KeyError: u'no item named False'

может кто-нибудь сказать мне, что я делаю неправильно?

464   3  

3 ответов:

когда вы len(df['column name']) вы просто получаете одно число, а именно количество строк в фрейме данных (т. е. длину самого столбца). Если вы хотите применить len для каждого элемента в столбце, используйте df['column name'].map(len). Так что попробуйте

df[df['column name'].map(len) < 2]

чтобы напрямую ответить на заголовок этого вопроса (который, как я понимаю, не обязательно является проблемой OP, но может помочь другим пользователям, столкнувшимся с этим вопросом), один из способов сделать это-использовать drop способ:

df = df.drop(some labels)

df = df.drop(df[<some boolean condition>].index)

пример

чтобы удалить все строки, где столбец "оценка"

df = df.drop(df[df.score < 50].index)

на месте версии (как указано в комментарии)

df.drop(df[df.score < 50].index, inplace=True)

несколько условий

(см. Логическое Индексации)

операторы: | на or,& на and и ~ на not. Они должны быть сгруппированы с помощью круглых скобок.

чтобы удалить все строки, где столбец "оценка" 20

df = df.drop(df[(df.score < 50) & (df.score > 20)].index)

Я искал решение для этого, и я наткнулся на очевидный подход, который заключается в том, чтобы просто отфильтровать фрейм данных и назначить обратно в исходный фрейм данных так

df = df[df["score"] > 50]
    Ничего не найдено.

Добавить ответ:
Отменить.