¿Hay una forma preferida de mantener el tipo de datos de una numpy
matriz fija como int
( int64
o lo que sea), mientras que todavía tiene un elemento dentro de la lista 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 dtype de la columna es int). Parece relanzar todo como flotante si hacemos de esto un DataFrame, pero realmente nos gustaría serlo int
.
Pensamientos?
Cosas intentadas:
Intenté usar la from_records()
función en pandas.DataFrame, con 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 convirtiera en flotante.
from_records
función en pandas.DataFrame, concoerce_float=False
, pero sin suerte ... todavía hace que los nuevos datos tengan tipofloat64
.Respuestas:
Esta capacidad se ha agregado a los pandas (a partir de la versión 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
En este punto, requiere el uso de la extensión dtype Int64 (en mayúscula), en lugar del dtype predeterminado int64 (en minúscula).
fuente
'Int64'
hacer que funcione. Será aún mejor cuando se habilitará de forma predeterminada.'Int64'
o hay algo así'Int8'
? Utiliza una cantidad increíble de memoria en comparación connp.float
.'Int8'
parece funcionar, peronp.float
aún parece cargar mucho más rápido. El problema parece ser que no está liberando memoria en el medio. Suponga que el recolector de basura finalmente se ejecutará.NaN
no se puede almacenar en una matriz entera. Esta 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 pasarán al menos 6 meses a un año antes de que NumPy obtenga estas características, parece:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Esta característica se ha agregado 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 )
fuente
Si el rendimiento no es el problema principal, puede almacenar cadenas en su lugar.
Luego puedes mezclar
NaN
todo lo que quieras. Si realmente desea tener enteros, dependiendo de su aplicación, puede usar-1
, o0
, o1234567890
, o algún otro valor dedicado para representarNaN
.También puede duplicar temporalmente las columnas: una como tiene, con flotantes; el otro experimental, con ints o strings. Luego inserta
asserts
en cada lugar razonable comprobando que los dos están sincronizados. Después de suficientes pruebas, puede soltar los flotadores.fuente
Esta no es una solución para todos los casos, pero la mía (coordenadas genómicas) he recurrido al uso de 0 como NaN
Esto al menos permite utilizar el tipo de columna 'nativo' adecuado, operaciones como la resta, la comparación, etc. funcionan como se espera
fuente
Pandas v0.24 +
La funcionalidad para admitir
NaN
en series enteras estará disponible en v0.24 hacia arriba. Hay información sobre esto en la sección "Novedades" v0.24, y más detalles en Tipo de datos enteros anulables .Pandas v0.23 y anteriores
En general, es mejor trabajar con
float
series siempre que sea posible, incluso cuando la serie está desviada deint
afloat
debido a la inclusión deNaN
valores. Esto permite cálculos vectorizados basados en NumPy donde, de lo contrario, se procesarían bucles de nivel de Python.Los documentos sugieren : "Una posibilidad es utilizar
dtype=object
matrices en su lugar". Por ejemplo:Por razones estéticas, por ejemplo, salida a un archivo, esto puede ser preferible.
Pandas v0.23 y anterior: antecedentes
NaN
se considera afloat
. Los documentos actualmente (a partir de v0.23) especifican la razón por la cual las series de enteros se convierten enfloat
:Los documentos también proporcionan reglas para la transmisión debido a la
NaN
inclusión:fuente
Esto ahora es posible, ya que pandas v 0.24.0
Notas de la versión de pandas 0.24.x Cita: " Pandas ha ganado la capacidad de mantener tipos enteros con valores faltantes.
fuente
Solo quería agregar que en caso de que esté tratando de convertir un vector flotante (1.143) a entero (1) que tenga NA convirtiéndose al nuevo tipo 'Int64' le dará un error. Para resolver esto, debe redondear los números y luego hacer ".astype ('Int64')"
Mi caso de uso es que tengo una serie flotante que quiero redondear a int, pero cuando haces .round () queda un '* .0' al final del número, por lo que puedes dejar ese 0 desde el final por convirtiendo a int.
fuente
Si hay espacios en blanco en los datos de texto, las columnas que normalmente serían números enteros se convertirán en flotantes como float64 dtype porque int64 dtype no puede manejar valores nulos. Esto puede causar un esquema inconsistente si está cargando varios archivos, algunos con espacios en blanco (que terminarán como float64 y otros sin los cuales terminarán como int64
Este código intentará convertir cualquier columna de tipo de número a Int64 (a diferencia de int64) ya que Int64 puede manejar nulos
fuente