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.
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
01.01.011 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
01111NaNIn[14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]:
A float64
B float64
dtype: object
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
00.10.21NaN0.320.40.5In[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
00.10.210.00.320.40.5In[16]: df.a.values
Out[16]: array([0.1,0.,0.4])
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')
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:
convert_objects
. Está en desuso. Useto_numeric
o en suastype
lugarRespuestas:
Esto está disponible en 0.11. Fuerza la conversión (o establece a nan) Esto funcionará incluso cuando
astype
fallará; también es serie por serie, por lo que no convertirá, digamos, una columna de cadena completafuente
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)
Puede convertir solo una columna.Puedes intentarlo
df.column_name = df.column_name.astype(float)
. En cuanto a losNaN
valores, debe especificar cómo deben convertirse, pero puede usar el.fillna
método para hacerlo.Ejemplo:
fuente
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:
fuente
pd.to_numeric
aDataFrame
, se puede usardf.apply(pd.to_numeric)
como se explica en detalle en esta respuesta .fuente
ValueError: could not convert string to float: 'date'
debe reemplazar las cadenas vacías ('') con np.nan antes de convertir a flotante. es decir:
fuente
Aquí hay un ejemplo
pero si se trata de todos los valores de cadena ... como fue en mi caso ... Convierta las columnas deseadas en flotantes:
Su marco de datos ahora tendrá valores flotantes :-)
fuente