Solución escalable para str.contains con lista de cadenas en pandas

Estoy analizando un dataframe pandas df1 contiene filas de objetos de cadena. Tengo una lista de referencia de palabras clave y necesito eliminar cada fila en df1 contenga cualquier palabra de la lista de referencia.

Actualmente, lo hago así:

 reference_list: ["words", "to", "remove"] df1 = df1[~df1[0].str.contains(r"words")] df1 = df1[~df1[0].str.contains(r"to")] df1 = df1[~df1[0].str.contains(r"remove")] 

Lo cual no es escalable a miles de palabras. Sin embargo, cuando lo hago:

 df1 = df1[~df1[0].str.contains(reference_word for reference_word in reference_list)] 

Cedo el error primero el argumento debe ser cadena o patrón comstackdo .

Siguiendo esta solución, intenté:

 reference_list: "words|to|remove" df1 = df1[~df1[0].str.contains(reference_list)] 

Lo que no genera una excepción pero no analiza todas las palabras.

¿Cómo usar efectivamente str.contains con una lista de palabras?

Para una solución escalable, haga lo siguiente:

  1. unir los contenidos de las palabras por la expresión regular o la tubería |
  2. pasar esto a str.contains
  3. Usa el resultado para filtrar df1

Para indexar la columna 0, no utilice df1[0] (ya que esto podría considerarse ambiguo). Sería mejor usar loc o iloc (ver más abajo).

 words = ["words", "to", "remove"] mask = df1.iloc[:, 0].str.contains(r'\b(?:{})\b'.format('|'.join(words))) df1 = df1[~mask] 

Nota: Esto también funcionará si las words son una serie.


Alternativamente, si su columna es solo una columna de palabras (no oraciones), entonces puede usar df.isin , que debería ser más rápido –

 df1 = df1[~df1.iloc[:, 0].isin(words)]