¿Existe alguna función que sea equivalente a una combinación de df.isin()y df[col].str.contains()?
Por ejemplo, digamos que tengo la serie
 s = pd.Series(['cat','hat','dog','fog','pet'])y quiero encontrar todos los lugares donde scontiene cualquiera de ['og', 'at'], me gustaría obtener todo menos 'mascota'.
Tengo una solución, pero es bastante poco elegante:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
¿Hay una mejor manera de hacer esto?

pd.Series.str.contains. Si el rendimiento es un problema, vale la pena investigarlo.Respuestas:
Una opción es simplemente usar el
|carácter regex para intentar hacer coincidir cada una de las subcadenas en las palabras de su Series(todavía se usastr.contains).Puede construir la expresión regular uniendo las palabras
searchforcon|:Como @AndyHayden señaló en los comentarios a continuación, tenga cuidado si sus subcadenas tienen caracteres especiales como
$y^que desea hacer coincidir literalmente. Estos caracteres tienen significados específicos en el contexto de expresiones regulares y afectarán la coincidencia.Puede hacer que su lista de subcadenas sea más segura escapando los caracteres no alfanuméricos con
re.escape:Las cadenas de esta nueva lista coincidirán literalmente con cada carácter cuando se usen con
str.contains.fuente
Puede usar
str.containssolo con un patrón de expresiones regulares usandoOR (|):O puede agregar la serie a y
dataframeluego usarstr.contains:Salida:
fuente
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)Aquí hay una lambda de una línea que también funciona:
Entrada:
Aplicar Lambda:
Salida:
fuente