Выполните поиск "does-not-содержать" на фрейме данных в pandas
Я проделал некоторые поиски и не могу понять, как фильтровать фреймворк данных с помощью df["col"].str.contains(word)
, однако мне интересно, есть ли способ сделать обратное: отфильтруйте dataframe с помощью этого набора комплиментов. например: к эффекту !(df["col"].str.contains(word))
.
Можно ли это сделать с помощью метода DataFrame
?
Ответы
Ответ 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])]