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''))