Tengo un DataFrame que contiene números como cadenas con comas para el marcador de miles. Necesito convertirlos en flotadores.
a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)
Supongo que necesito usar locale.atof. En efecto
df[0].apply(locale.atof)
funciona como se esperaba. Consigo una serie de carrozas.
Pero cuando lo aplico al DataFrame, aparece un error.
df.apply(locale.atof)
TypeError: ("no se puede convertir la serie a", u'Ocurrió en el índice 0 ')
y
df[0:1].apply(locale.atof)
da otro error:
ValueError: ('literal no válido para float (): 1200', u'ocurred en el índice 0 ')
Entonces, ¿cómo convierto esto DataFrame
de cadenas en un DataFrame de flotadores?
apply
en un DataFrame pasa una columna completa a la función como una serie (en este casolocale.atof
, que espera una cadena). Si usa elapplymap
método que @AndyHayden hace en la respuesta a continuación, debería poder hacerlo bien.Respuestas:
Si está leyendo desde csv , puede usar el argumento miles :
df.read_csv('foo.tsv', sep='\t', thousands=',')
Es probable que este método sea más eficaz que realizar la operación como un paso separado.
Primero debe establecer la configuración regional :
In [ 9]: import locale In [10]: from locale import atof In [11]: locale.setlocale(locale.LC_NUMERIC, '') Out[11]: 'en_GB.UTF-8' In [12]: df.applymap(atof) Out[12]: 0 1 0 1200 4200.00 1 7000 -0.03 2 5 0.00
fuente
Puede utilizar el método pandas.Series.str.replace :
df.iloc[:,:].str.replace(',', '').astype(float)
Este método puede eliminar o reemplazar la coma en la cadena.
fuente
df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Puede convertir una columna a la vez como este:
df['colname'] = df['colname'].str.replace(',', '').astype(float)
fuente