Удаление данных в пандах при условии строкового условия - PullRequest
0 голосов
/ 14 мая 2018

У меня проблемы с пониманием механики, приведенной ниже.

У меня dataframe чтение из .csv:

  a1 b1 c1
1 aa bb cc
2 ab ba ca 

df.drop(df['a1'].str.contains('aa',case = False))

Я хочу отбросить все строкив столбце a1, которые содержат 'aa'

Я полагаю, что попытался все здесь, но все еще получаю:

ValueError: tags [False False False ... False False False]не содержится в оси

Да, я также пытался

skipinitialspace=True
axis=1

Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

str.contains возвращает маску:

df['a1'].str.contains('aa',case = False)

1     True
2    False
Name: a1, dtype: bool

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

?df.drop

Signature: df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
Docstring:
Return new object with labels in requested axis removed.

Parameters
----------
labels : single label or list-like
    Index or column labels to drop.

Вы можете определить индексные метки из маски и передать эти для отбрасывания

idx = df.index[df['a1'].str.contains('aa')]
df.drop(idx)

   a1  b1  c1
2  ab  ba  ca

Однако, это слишком ветрено, поэтому я бы рекомендовал просто придерживаться пандейского метода отбрасывания строк на основе условий, логическое индексирование :

df[~df['a1'].str.contains('aa')]

   a1  b1  c1
2  ab  ba  ca

Если кто-то заинтересован в удалении строк, содержащих строки в списке

df = df[~df['a1'].str.contains('|'.join(my_list))]

Обязательно уберите пробелы. Кредит https://stackoverflow.com/a/45681254/9500464

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