NumPy o Pandas: mantener el tipo de matriz como entero mientras se tiene un valor NaN
¿Existe una forma preferida de mantener el tipo de datos de una numpy
matriz fijo como int
(o int64
lo 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=False
y 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.
NaN
no 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 )
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).
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.