strings str multiple containing python string python-2.7 csv pandas

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.