verificar una tamaño saber numero numerica leer entero comparar como cadenas cadena python string pandas dataframe match

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 .