NumPy o Pandas: mantener el tipo de matriz como entero mientras se tiene un valor NaN

Resuelto ely asked hace 12 años • 10 respuestas

¿Existe una forma preferida de mantener el tipo de datos de una numpymatriz fijo como int(o int64lo que sea), sin dejar de tener un elemento dentro listado como numpy.NaN?

En particular, estoy convirtiendo una estructura de datos interna en un Pandas DataFrame. En nuestra estructura, tenemos columnas de tipo entero que todavía tienen NaN (pero el tipo d de la columna es int). Parece reformular todo como un flotante si lo convertimos en un DataFrame, pero realmente nos gustaría que lo fuera int.

¿Pensamientos?

Cosas probadas:

Intenté usar la from_records()función en pandas.DataFrame coerce_float=Falsey esto no ayudó. También intenté usar matrices enmascaradas NumPy, con NaN fill_value, que tampoco funcionó. Todo esto provocó que el tipo de datos de la columna se volviera flotante.

ely avatar Jul 19 '12 01:07 ely
Aceptado

NaNno se puede almacenar en una matriz de números enteros. Ésta es una limitación conocida de los pandas en este momento; He estado esperando que se realicen progresos con los valores de NA en NumPy (similar a los NA en R), pero al parecer pasarán al menos de 6 meses a un año antes de que NumPy obtenga estas características:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(Esta característica se agregó a partir de la versión 0.24 de pandas, pero tenga en cuenta que requiere el uso de la extensión dtype Int64 (en mayúscula), en lugar del dtype predeterminado int64 (minúscula): https://pandas.pydata.org/pandas- docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support )

Wes McKinney avatar Jul 18 '2012 18:07 Wes McKinney

Esta capacidad se ha agregado a pandas a partir de la versión 0.24 .

En este punto, requiere el uso de la extensión dtype 'Int64'(en mayúscula), en lugar del dtype predeterminado 'int64'(minúscula).

techvslife avatar Aug 24 '2018 03:08 techvslife

En caso de que esté intentando convertir un vector flotante (1.143) a un entero (1) y ese vector tenga NA, convertirlo al nuevo tipo d 'Int64' le dará un error. Para resolver esto tienes que redondear los números y luego hacer ".astype('Int64')"

s1 = pd.Series([1.434, 2.343, np.nan])
#without round() the next line returns an error 
s1.astype('Int64')
#cannot safely cast non-equivalent float64 to int64
##with round() it works
s1.round().astype('Int64')
0      1
1      2
2    NaN
dtype: Int64

Mi caso de uso es que tengo una serie flotante que quiero redondear a int, pero cuando lo haces, .round() todavía tiene decimales, necesitas convertir a int para eliminar decimales.