Подтвердить что ты не робот

Выполните поиск "does-not-содержать" на фрейме данных в pandas

Я проделал некоторые поиски и не могу понять, как фильтровать фреймворк данных с помощью df["col"].str.contains(word), однако мне интересно, есть ли способ сделать обратное: отфильтруйте dataframe с помощью этого набора комплиментов. например: к эффекту !(df["col"].str.contains(word)).

Можно ли это сделать с помощью метода DataFrame?

4b9b3361

Ответ 1

Вы можете использовать оператор инвертирования (~) (который действует как не для логических данных):

new_df = df[~df["col"].str.contains(word)]

где new_df - копия, возвращенная RHS.

Содержит также принимает регулярное выражение...


Если вышеприведенное выдает ошибку ValueError, причина, вероятно, в том, что вы смешали типы данных, поэтому используйте na=False:

new_df = df[~df["col"].str.contains(word, na=False)]

Или же,

new_df = df[df["col"].str.contains(word) == False]

Ответ 2

У меня также были проблемы с символом not (~), так что здесь другой путь из другого fooobar.com/questions/39998/...:

df[df["col"].str.contains('this|that')==False]

Ответ 3

Мне нужно было избавиться от значений NULL перед использованием команды, рекомендованной Энди выше. Пример:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

Теперь выполните команду:

~df["second"].str.contains(word)

Я получаю следующую ошибку:

TypeError: bad operand type for unary ~: 'float'

Я избавился от значений NULL, используя dropna() или fillna(), и без проблем перезапустил команду.

Ответ 4

В дополнение к ответу nanselm2, вы можете использовать 0 вместо False:

df["col"].str.contains(word)==0

Ответ 5

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

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]