¿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 s
contiene 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
searchfor
con|
: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.contains
solo con un patrón de expresiones regulares usandoOR (|)
:O puede agregar la serie a y
dataframe
luego 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