Conversión de cadenas en flotantes en un DataFrame

112

Cómo convertir una columna DataFrame que contiene cadenas y NaNvalores en flotantes. Y hay otra columna cuyos valores son cadenas y flotantes; cómo convertir toda esta columna en flotantes.

Neer
fuente
7
NO USAR convert_objects. Está en desuso. Use to_numerico en su astypelugar
Ted Petrou

Respuestas:

72

NOTA: pd.convert_objects ahora ha quedado obsoleto. Debe usar pd.Series.astype(float)o pd.to_numericcomo se describe en otras respuestas.

Esto está disponible en 0.11. Fuerza la conversión (o establece a nan) Esto funcionará incluso cuando astypefallará; también es serie por serie, por lo que no convertirá, digamos, una columna de cadena completa

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object
Jeff
fuente
Tenga en cuenta que esto no funciona para columnas (en leadt multiindex), funciona solo para valores en el marco de datos
denfromufa
1
Tuve que usar set_levels para convertir la cadena en flotante
denfromufa
16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Puede convertir solo una columna.
Jack
19
esto ahora es pd.to_numeric (col) en versiones más recientes
Jeff
11
convert_objects está en desuso en los pandas más nuevos. Utilice los convertidores específicos del tipo de datos pd.to_numeric.
Thomas Matthew
57

Puedes intentarlo df.column_name = df.column_name.astype(float). En cuanto a los NaNvalores, debe especificar cómo deben convertirse, pero puede usar el .fillnamétodo para hacerlo.

Ejemplo:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])
raíz
fuente
47

En una versión más reciente de pandas (0.17 y superior), puede usar la función to_numeric . Le permite convertir todo el marco de datos o solo columnas individuales. También le brinda la posibilidad de seleccionar cómo tratar las cosas que no se pueden convertir a valores numéricos:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')
Salvador Dalí
fuente
32
Para postularse pd.to_numerica DataFrame, se puede usar df.apply(pd.to_numeric)como se explica en detalle en esta respuesta .
Ninjakannon
31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
Claude COULOMBE
fuente
6
Esto no funciona cuando se convierte de String a Float:ValueError: could not convert string to float: 'date'
Jack
@Jack, ¿conoces la solución aquí? Me estoy encontrando con este problema exacto al convertir una cadena en flotante.
Hatt
@Hatt estoy enfrentando el mismo problema. ¿Encontraste la solución?
Prakhar Jhudele
@Jack No estoy seguro, pero parece que mezcla el formato de fecha y la flotación. # convertir a fecha y hora df ['fecha'] = pd.to_datetime (df ['fecha'])
Claude COULOMBE
8

debe reemplazar las cadenas vacías ('') con np.nan antes de convertir a flotante. es decir:

df['a']=df.a.replace('',np.nan).astype(float)
Paul Mwaniki
fuente
1

Aquí hay un ejemplo

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

pero si se trata de todos los valores de cadena ... como fue en mi caso ... Convierta las columnas deseadas en flotantes:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Su marco de datos ahora tendrá valores flotantes :-)

ArmandduPlessis
fuente