sub column python dataframe pandas

column - python pandas replace string



Pandas DataFrame: elimina las partes no deseadas de las cadenas en una columna (7)

Aquí hay un error: actualmente no puede pasar argumentos a str.lstrip y str.rstrip :

http://github.com/pydata/pandas/issues/2411

EDITAR: 2012-12-07 esto funciona ahora en la rama de desarrollo:

In [8]: df[''result''].str.lstrip(''+-'').str.rstrip(''aAbBcC'') Out[8]: 1 52 2 62 3 44 4 30 5 110 Name: result

Estoy buscando una forma eficiente de eliminar partes no deseadas de cadenas en una columna de DataFrame.

Los datos se ven así:

time result 1 09:00 +52A 2 10:00 +62B 3 11:00 +44a 4 12:00 +30b 5 13:00 -110a

Necesito recortar estos datos a:

time result 1 09:00 52 2 10:00 62 3 11:00 44 4 12:00 30 5 13:00 110

Intenté .str.lstrip(''+-'') y. str.rstrip(''aAbBcC'') , pero obtuvo un error:

TypeError: wrapper() takes exactly 1 argument (2 given)

¡Cualquier apuntador sería muy apreciado!


En el caso particular en que conozca la cantidad de posiciones que desea eliminar de la columna del marco de datos, puede usar la indexación de cadenas dentro de una función lambda para deshacerse de esas partes:

Último personaje:

data[''result''] = data[''result''].map(lambda x: str(x)[:-1])

Primeros dos personajes:

data[''result''] = data[''result''].map(lambda x: str(x)[2:])


He encontrado grandes diferencias en el rendimiento entre los diversos métodos para hacer cosas como esta (es decir, modificar cada elemento de una serie dentro de un DataFrame). A menudo, una comprensión de la lista puede ser la más rápida; consulte la carrera de códigos a continuación:

import pandas as pd #Map data = pd.DataFrame({''time'':[''09:00'',''10:00'',''11:00'',''12:00'',''13:00''], ''result'':[''+52A'',''+62B'',''+44a'',''+30b'',''-110a'']}) %timeit data[''result''] = data[''result''].map(lambda x: x.lstrip(''+-'').rstrip(''aAbBcC'')) 10000 loops, best of 3: 187 µs per loop #List comprehension data = pd.DataFrame({''time'':[''09:00'',''10:00'',''11:00'',''12:00'',''13:00''], ''result'':[''+52A'',''+62B'',''+44a'',''+30b'',''-110a'']}) %timeit data[''result''] = [x.lstrip(''+-'').rstrip(''aAbBcC'') for x in data[''result'']] 10000 loops, best of 3: 117 µs per loop #.str data = pd.DataFrame({''time'':[''09:00'',''10:00'',''11:00'',''12:00'',''13:00''], ''result'':[''+52A'',''+62B'',''+44a'',''+30b'',''-110a'']}) %timeit data[''result''] = data[''result''].str.lstrip(''+-'').str.rstrip(''aAbBcC'') 1000 loops, best of 3: 336 µs per loop


Un método muy simple sería usar el método extract para seleccionar todos los dígitos. Simplemente proporciónele la expresión regular ''/d+'' que extrae cualquier cantidad de dígitos.

df[''result''] = df.result.str.extract(''(/d+)'', expand=True).astype(int) df time result 1 09:00 52 2 10:00 62 3 11:00 44 4 12:00 30 5 13:00 110


Utilizaría la función de reemplazo de pandas, muy simple y potente, ya que puede usar expresiones regulares. Debajo estoy usando el regex / D para eliminar cualquier carácter que no sea un dígito, pero obviamente podrías ser bastante creativo con Regex.

data[''result''].replace(regex=True,inplace=True,to_replace=r''/D'',value=r'''')


=RIGHT(LEFT(O13,(LEN(O13)-1)),LEN(LEFT(O13,(LEN(O13)-1))-1))

Coloque esta columna de derecha de resultado y obtenga el resultado.


data[''result''] = data[''result''].map(lambda x: x.lstrip(''+-'').rstrip(''aAbBcC''))