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 Nonepero en su lugar nanestá asignado. Seguramente Nonees 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 Noney nan? ¿Por qué se nanasigna 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 vuna "celda vacía" / nancaso?

qwertyno es un número.Noneserí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.isnullypd.notnullpara probar los datos faltantes (NaN).fuente
np.nanpermite operaciones vectorizadas; es un valor flotante, mientras queNonepor definición fuerza elobjecttipo, 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?NaNse puede utilizar como valor numérico en operaciones matemáticas, mientrasNoneque no se puede (o al menos no debería).NaNes un valor numérico, como se define en el estándar de coma flotante IEEE 754 .Nonees 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
Nonecomo operando.Entonces, dependiendo del caso, puede usarlo
Nonecomo 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
nansumynan_to_numpor ejemplo.fuente
df=pd.readcsv('file.csv')me daNaNvalores 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=floatdeben estar representados por valores numéricos, queNaNes yNonenoNonees ( esNoneType).naargumento, 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 Nonedevuelve 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 queNaNestos elementos se consideren "vacíos"fuente
isnan(2)que volveríaFalse, ya que 2 no es un NaN.numpy.emptyno inicializa los valores de la matriz enNaN. Simplemente no inicializa los valores en absoluto.Nonecondició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.isnullque funciona con cadenas.A continuación se muestran las diferencias:
nanpertenece a la clasefloatNonepertenece a la claseNoneTypeEncontré el siguiente artículo muy útil: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
fuente
NaNsignifica NO un número .Nonepodría representar cualquiera .fuente