Convierta cadenas de números con comas en pandas DataFrame para flotar


88

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 DataFramede cadenas en un DataFrame de flotadores?


2
Pregunta antigua, pero el OP está recibiendo ese error porque applyen un DataFrame pasa una columna completa a la función como una serie (en este caso locale.atof, que espera una cadena). Si usa el applymapmétodo que @AndyHayden hace en la respuesta a continuación, debería poder hacerlo bien.
TC Proctor

Respuestas:


144

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

Debería haber dicho que configuré la configuración regional. Aún tengo el error.
pheon

2
Pero estoy usando df.read_fwf, y eso también tiene la opción "miles = ','", que funciona. Gracias.
pheon

Por otra parte, ¿por qué df.applymap (atof) funciona para ti pero no para mí? Mi configuración regional es 'en_US.UTF-8'.
pheon

10
Voté esto a favor de la sugerencia de argumento 'miles' para la función read_csv. Eso funcionó muy bien para mí.
rockfakie

3
Quería agregar que también puede usar "decimal = ','" si está tratando con flotadores.
VessoVit

32

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.


1
Recibo "AttributeError: el objeto 'DataFrame' no tiene atributo 'str'", no
tengo

1
Pero esto funciona:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

21

Puede convertir una columna a la vez como este:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.