Leí datos de un archivo .csv a un marco de datos de Pandas como se muestra a continuación. Para una de las columnas, a saber id
, quiero especificar el tipo de columna como int
. El problema es que la id
serie tiene valores faltantes / vacíos.
Cuando intento convertir la id
columna a entero mientras leo el .csv, obtengo:
df= pd.read_csv("data.csv", dtype={'id': int})
error: Integer column has NA values
Alternativamente, intenté convertir el tipo de columna después de leer como se muestra a continuación, pero esta vez obtengo:
df= pd.read_csv("data.csv")
df[['id']] = df[['id']].astype(int)
error: Cannot convert NA to integer
¿Cómo puedo abordar esto?
Respuestas:
La falta de representante de NaN en columnas enteras es un panda "gotcha" .
La solución habitual es simplemente usar flotadores.
fuente
df = df.astype(pd.Int32Dtype())
(para convertir todo el DataFrame, o)df['col'] = df['col'].astype(pd.Int32Dtype())
. Otros tipos enteros anulables aceptados sonpd.Int16Dtype
ypd.Int64Dtype
. Elige tu veneno.En la versión 0.24. + Pandas ha ganado la capacidad de mantener tipos enteros con valores faltantes.
Tipo de datos entero anulable .
Los pandas pueden representar datos enteros con valores posiblemente perdidos utilizando
arrays.IntegerArray
. Este es un tipo de extensión implementado dentro de pandas. No es el dtype predeterminado para enteros, y no se deducirá; debe pasar explícitamente la dtype enarray()
oSeries
:Para convertir columnas a enteros anulables, use:
fuente
"Int64"
y no"int64"
(primero 'i' debe estar en mayúscula)df.myCol = df.myCol.astype('Int64')
odf['myCol'] = df['myCol'].astype('Int64')
Mi caso de uso es mezclar datos antes de cargarlos en una tabla DB:
Elimine los NaN, conviértalos en int, conviértalos en str y luego vuelva a insertar los NAN.
¡No es bonito pero hace el trabajo!
fuente
Ahora es posible crear una columna de pandas que contenga NaNs como dtype
int
, ya que ahora se agrega oficialmente en pandas 0.24.0Notas de la versión de pandas 0.24.x Cita: " Pandas ha ganado la capacidad de mantener tipos enteros con valores perdidos
fuente
Si desea combinar enteros y NaN en una columna, puede usar el tipo de datos 'objeto':
Esto reemplazará los NaN con un número entero (no importa cuál), se convertirá en int, se convertirá en objeto y finalmente volverá a insertar los NaN.
fuente
Si puede modificar sus datos almacenados, use un valor centinela para los que faltan
id
. Un caso de uso común, inferido por el nombre de la columna, ya queid
es un número entero, estrictamente mayor que cero, podría usarlo0
como un valor centinela para poder escribirfuente
Podría usar
.dropna()
si está bien soltar las filas con los valores NaN.Alternativamente, use
.fillna()
y.astype()
para reemplazar el NaN con valores y conviértalos a int.Me encontré con este problema al procesar un archivo CSV con enteros grandes, mientras faltaban algunos de ellos (NaN). Usar float como tipo no era una opción, porque podría perder la precisión.
Mi solución fue usar str como el tipo intermedio . Luego puede convertir la cadena a int como desee más adelante en el código. Reemplacé NaN con 0, pero puedes elegir cualquier valor.
Para la ilustración, aquí hay un ejemplo de cómo los flotadores pueden perder precisión:
Y la salida es:
fuente
La mayoría de las soluciones aquí le indican cómo usar un número entero de marcador de posición para representar nulos. Sin embargo, ese enfoque no es útil si no está seguro de que el entero no aparezca en sus datos de origen. Mi método con formateará flotantes sin sus valores decimales y convertirá nulos a Ninguno. El resultado es un tipo de datos de objeto que se verá como un campo entero con valores nulos cuando se carga en un CSV.
fuente
Me encontré con este problema trabajando con pyspark. Como se trata de una interfaz de Python para el código que se ejecuta en un jvm, requiere seguridad de tipo y el uso de float en lugar de int no es una opción. Trabajé en torno al problema envolviendo los pandas
pd.read_csv
en una función que llenará las columnas definidas por el usuario con los valores de relleno definidos por el usuario antes de convertirlos al tipo requerido. Esto es lo que terminé usando:fuente
fuente
edit
agregar información adicional y / o complementar sus explicaciones con la documentación de origen.Primero elimine las filas que contienen NaN. Luego, haga la conversión entera en las filas restantes. Por fin inserte las filas eliminadas nuevamente. Espero que funcione
fuente
Suponiendo que su DateColumn formateado 3312018.0 se convierta a 31/03/2018 como una cadena. Y faltan algunos registros o 0.
fuente