python - to_numeric - to float pandas
¿Cuándo aplicar(pd.to_numeric) y cuándo astype(np.float64) en python? (1)
Tengo un objeto DataFrame de pandas llamado xiv
que tiene una columna de int64
volumen int64
.
In[]: xiv[''Volume''].head(5)
Out[]:
0 252000
1 484000
2 62000
3 168000
4 232000
Name: Volume, dtype: int64
He leído otros mensajes (como this y this ) que sugieren las siguientes soluciones. Pero cuando uso cualquiera de los dos enfoques, no parece cambiar el dtype
de datos subyacentes:
In[]: xiv[''Volume''] = pd.to_numeric(xiv[''Volume''])
In[]: xiv[''Volume''].dtypes
Out[]:
dtype(''int64'')
O...
In[]: xiv[''Volume''] = pd.to_numeric(xiv[''Volume''])
Out[]: ###omitted for brevity###
In[]: xiv[''Volume''].dtypes
Out[]:
dtype(''int64'')
In[]: xiv[''Volume''] = xiv[''Volume''].apply(pd.to_numeric)
In[]: xiv[''Volume''].dtypes
Out[]:
dtype(''int64'')
También he intentado hacer una Series
pandas por separado y usar los métodos mencionados anteriormente en esa serie y reasignar al objeto x[''Volume'']
, que es un objeto pandas.core.series.Series
.
Sin embargo, he encontrado una solución a este problema utilizando el tipo numpy
paquete float64
. Esto funciona, pero no sé por qué es diferente .
In[]: xiv[''Volume''] = xiv[''Volume''].astype(np.float64)
In[]: xiv[''Volume''].dtypes
Out[]:
dtype(''float64'')
¿Puede alguien explicar cómo lograr con la biblioteca pandas
lo que la biblioteca numpy
parece hacer fácilmente con su clase float64
? es decir, convierta la columna en el marco de datos xiv
a un float64
en su lugar.
Si ya tiene dtypes numéricos ( int8|16|32|64
, float64
, boolean
), puede convertirlo a otro dtype "numérico" usando el método .astype() .
Manifestación:
In [90]: df = pd.DataFrame(np.random.randint(10**5,10**7,(5,3)),columns=list(''abc''), dtype=np.int64)
In [91]: df
Out[91]:
a b c
0 9059440 9590567 2076918
1 5861102 4566089 1947323
2 6636568 162770 2487991
3 6794572 5236903 5628779
4 470121 4044395 4546794
In [92]: df.dtypes
Out[92]:
a int64
b int64
c int64
dtype: object
In [93]: df[''a''] = df[''a''].astype(float)
In [94]: df.dtypes
Out[94]:
a float64
b int64
c int64
dtype: object
No funcionará para los tipos de object
(cadena), que no se pueden convertir a números:
In [95]: df.loc[1, ''b''] = ''XXXXXX''
In [96]: df
Out[96]:
a b c
0 9059440.0 9590567 2076918
1 5861102.0 XXXXXX 1947323
2 6636568.0 162770 2487991
3 6794572.0 5236903 5628779
4 470121.0 4044395 4546794
In [97]: df.dtypes
Out[97]:
a float64
b object
c int64
dtype: object
In [98]: df[''b''].astype(float)
...
skipped
...
ValueError: could not convert string to float: ''XXXXXX''
Así que aquí queremos usar el método pd.to_numeric() :
In [99]: df[''b''] = pd.to_numeric(df[''b''], errors=''coerce'')
In [100]: df
Out[100]:
a b c
0 9059440.0 9590567.0 2076918
1 5861102.0 NaN 1947323
2 6636568.0 162770.0 2487991
3 6794572.0 5236903.0 5628779
4 470121.0 4044395.0 4546794
In [101]: df.dtypes
Out[101]:
a float64
b float64
c int64
dtype: object