Me gustaría filtrar limpiamente un marco de datos usando expresiones regulares en una de las columnas.
Para un ejemplo artificial:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Quiero filtrar las filas a las que comienzan con el f
uso de una expresión regular. Primero ve:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Eso no es demasiado útil. Sin embargo, esto me dará mi índice booleano:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Entonces podría hacer mi restricción:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Sin embargo, eso me hace poner artificialmente un grupo en la expresión regular, y parece que tal vez no sea el camino limpio. ¿Hay una mejor manera de hacer esto?
foo[foo.b.str.startswith("f")]
funcionará.foo[foo.b.str.match('(f.*)').str.len() > 0]
es una solución bastante buena! Más personalizable y útil que comienza porque contiene la versatilidad de expresiones regulares en él.foo[foo.b.str.match('f.*')]
funciona en pandas 0.24.2 para mí.Respuestas:
El uso contiene en su lugar:
fuente
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Ya existe una función de manejo de cadenas
Series.str.startswith()
. Deberías intentarlofoo[foo.b.str.startswith('f')]
.Resultado:
Pienso lo que esperas.
Alternativamente, puede usar contiene con la opción regex. Por ejemplo:
Resultado:
na=False
es para evitar errores en caso de que haya valores nan, nulos, etc.fuente
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Búsqueda de múltiples columnas con marco de datos:
fuente
frame
? y'C:\test\test.txt'
? Parece que estás respondiendo una pregunta diferente.Esto puede ser un poco tarde, pero ahora es más fácil de hacer en Pandas. Puede llamar a match con
as_indexer=True
para obtener resultados booleanos. Esto está documentado (junto con la diferencia entrematch
ycontains
) aquí .fuente
Gracias por la gran respuesta @ user3136169, aquí hay un ejemplo de cómo se podría hacer eso también eliminando los valores NoneType.
También puede agregar expresiones regulares como un argumento:
fuente
Escriba una función booleana que verifique la expresión regular y use apply en la columna
fuente
Usando
str
rebanadafuente