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?

feno
fuente
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
Andy Hayden
fuente
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.

shen ke
fuente
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)
ghollah kioko
fuente