python - containing - str contains multiple strings
Inversión de string.contains En python, pandas (2)
Tengo algo como esto en mi código:
df2 = df[df[''A''].str.contains("Hello|World")]
Sin embargo, quiero todas las filas que no contengan ni Hello ni World. ¿Cómo puedo invertir esto más eficientemente?
El método .contains()
usa expresiones regulares, por lo que puede usar una prueba negativa de búsqueda anticipada para determinar que una palabra no está contenida:
df[''A''].str.contains(r''^(?:(?!Hello|World).)*$'')
Esta expresión coincide con cualquier cadena donde las palabras Hello
y World
no se encuentran en ninguna parte de la cadena.
Manifestación:
>>> 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
Puedes usar la tilde ~
para voltear los valores de 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]
Si esta es la forma más eficiente, no lo sé; tendrías que sincronizarlo con tus otras opciones. A veces, usar una expresión regular es más lento que cosas como df[~(df.A.str.contains("Hello") | (df.A.str.contains("World")))]
, pero soy malo en adivinando dónde están los cruces.