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

Сторнирование string.contains В python pandas

В моем коде есть что-то вроде этого:

df2 = df[df['A'].str.contains("Hello|World")]

Тем не менее, я хочу, чтобы все строки не содержали ни Hello, ни World. Как я могу наиболее эффективно отменить это?

4b9b3361

Ответ 1

Вы можете использовать тильду ~, чтобы перевернуть значения bool:

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]})
>>> df.A.str.contains("Hello|World")
0     True
1    False
2     True
3    False
Name: A, dtype: bool
>>> ~df.A.str.contains("Hello|World")
0    False
1     True
2    False
3     True
Name: A, dtype: bool
>>> df[~df.A.str.contains("Hello|World")]
       A
1   this
3  apple

[2 rows x 1 columns]

Является ли это наиболее эффективным способом, я не знаю; вам придется использовать его для других вариантов. Иногда использование регулярного выражения происходит медленнее, чем такие вещи, как df[~(df.A.str.contains("Hello") | (df.A.str.contains("World")))], но я плохо знаю, где кроссоверы.

Ответ 2

Метод .contains() использует регулярные выражения, поэтому вы можете использовать отрицательный контрольный тест, чтобы определить, что слово не содержится:

df['A'].str.contains(r'^(?:(?!Hello|World).)*$')

Это выражение соответствует любой строке, где слова Hello и World не найдены нигде в строке.

Демо:

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]})
>>> df['A'].str.contains(r'^(?:(?!Hello|World).)*$')
0    False
1     True
2    False
3     True
Name: A, dtype: bool
>>> df[df['A'].str.contains(r'^(?:(?!Hello|World).)*$')]
       A
1   this
3  apple

Ответ 3

df['A'].str.contains("hello|world").apply(lambda x : not x)