una - string en python
¿Cómo probar si una cadena contiene una de las subcadenas en una lista, en pandas? (2)
¿Hay alguna función que sea equivalente a una combinación de
df.isin()
y
df[col].str.contains()
?
Por ejemplo, supongamos 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 ''pet''.
Tengo una solución, pero es 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?
Puede usar
str.contains
solo con un patrón regex usando
OR (|)
:
s[s.str.contains(''og|at'')]
O puede agregar la serie a un
dataframe
luego usar
str.contains
:
df = pd.DataFrame(s)
df[s.str.contains(''og|at'')]
Salida:
0 cat
1 hat
2 dog
3 fog
Una opción es usar la expresión regular
|
carácter para tratar de hacer coincidir cada una de las subcadenas en las palabras de su Serie
s
(todavía usando
str.contains
).
Puede construir la expresión regular uniendo las palabras en
searchfor
con
|
:
>>> searchfor = [''og'', ''at'']
>>> s[s.str.contains(''|''.join(searchfor))]
0 cat
1 hat
2 dog
3 fog
dtype: object
Como @AndyHayden señaló en los comentarios a continuación, tenga cuidado si sus subcadenas tienen caracteres especiales como
$
y
^
que desea que coincidan 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 de caracteres no alfanuméricos con
re.escape
:
>>> import re
>>> matches = [''$money'', ''x^y'']
>>> safe_matches = [re.escape(m) for m in matches]
>>> safe_matches
[''//$money'', ''x//^y'']
Las cadenas con esta nueva lista coincidirán literalmente con cada carácter cuando se usen con
str.contains
.