Estoy leyendo dos columnas de un archivo csv usando pandas readcsv()
y luego asignando los valores a un diccionario. Las columnas contienen cadenas de números y letras. Ocasionalmente, hay casos en los que una celda está vacía. En mi opinión, el valor leído en esa entrada del diccionario debería ser None
pero en su lugar nan
está asignado. Seguramente None
es más descriptivo de una celda vacía ya que tiene un valor nulo, mientras quenan
simplemente dice que el valor leído no es un número.
¿Mi comprensión es correcta, cuál ES la diferencia entre None
y nan
? ¿Por qué se nan
asigna en lugar deNone
?
Además, mi verificación de diccionario en busca de celdas vacías ha estado usando numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Pero esto me da un error que dice que no puedo usar esta verificación para v
. Supongo que se debe a que se debe usar una variable entera o flotante, no una cadena. Si esto es cierto, ¿cómo puedo verificar si hay v
una "celda vacía" / nan
caso?
qwerty
no es un número.None
sería una mejor descripción del valor de una celda vacía.Respuestas:
NaN se usa como un marcador de posición para los datos faltantes de manera consistente en pandas , la consistencia es buena. Normalmente leo / traduzco NaN como "perdido" . También vea la sección 'trabajar con datos faltantes' en los documentos.
Wes escribe en los documentos 'elección de la representación de NA' :
Nota: el "gotcha" de que las series enteras que contienen datos faltantes son upcast a flotantes .
En mi opinión, la razón principal para usar NaN (en lugar de None) es que se puede almacenar con el tipo dtype float64 de numpy, en lugar del dtype de objeto menos eficiente, consulte las promociones de tipo NA .
Jeff comenta (abajo) sobre esto:
Dicho esto, muchas operaciones pueden funcionar igual de bien con None vs NaN (pero quizás no sean compatibles, es decir, a veces pueden dar resultados sorprendentes ):
Para responder a la segunda pregunta:
debería utilizar
pd.isnull
ypd.notnull
para probar los datos faltantes (NaN).fuente
np.nan
permite operaciones vectorizadas; es un valor flotante, mientras queNone
por definición fuerza elobject
tipo, y básicamente deshabilita toda la eficiencia en numpy, así que repita 3 veces rápido:object==bad, float==good
<NA>
También es unnp.nan
?NaN
se puede utilizar como valor numérico en operaciones matemáticas, mientrasNone
que no se puede (o al menos no debería).NaN
es un valor numérico, como se define en el estándar de coma flotante IEEE 754 .None
es un tipo interno de Python (NoneType
) y sería más como "inexistente" o "vacío" que "numéricamente no válido" en este contexto.El principal "síntoma" de eso es que, si realiza, digamos, un promedio o una suma en una matriz que contiene NaN, incluso uno solo, obtiene NaN como resultado ...
Por otro lado, no puede realizar operaciones matemáticas utilizando
None
como operando.Entonces, dependiendo del caso, puede usarlo
None
como una forma de decirle a su algoritmo que no considere valores inválidos o inexistentes en los cálculos. Eso significaría que el algoritmo debería probar cada valor para ver si lo esNone
.Numpy tiene algunas funciones para evitar que los valores de NaN contaminen sus resultados, como
nansum
ynan_to_num
por ejemplo.fuente
df=pd.readcsv('file.csv')
me daNaN
valores para las celdas vacías y noNone
? Hasta donde yo sé, pd.DataFrames no son exclusivos de los números.dtype
, por lo que los valores no válidos dedtype=float
deben estar representados por valores numéricos, queNaN
es yNone
noNone
es ( esNoneType
).na
argumento, que le permite decidir qué valor va a utilizar para reemplazar los valores no disponiblesLa función
isnan()
comprueba si algo es "No es un número" y devolverá si una variable es un número o no, por ejemploisnan(2)
, devolvería falsoEl condicional
myVar is not None
devuelve si la variable está definida o noSu matriz numpy utiliza
isnan()
porque está destinada a ser una matriz de números e inicializa todos los elementos de la matriz para queNaN
estos elementos se consideren "vacíos"fuente
isnan(2)
que volveríaFalse
, ya que 2 no es un NaN.numpy.empty
no inicializa los valores de la matriz enNaN
. Simplemente no inicializa los valores en absoluto.None
condición esmyVar is not None
, nomyVar != None
.np.isnan()
no está implementado para variables de cadena, por lo que si le pasa una cadena, se bloqueará. Es mejor usar elpd.isnull
que funciona con cadenas.A continuación se muestran las diferencias:
nan
pertenece a la clasefloat
None
pertenece a la claseNoneType
Encontré el siguiente artículo muy útil: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
fuente
NaN
significa NO un número .None
podría representar cualquiera .fuente