values to_numeric non float finite convert column cannot python pandas numpy dataframe types

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