¿Cuál es la diferencia entre NaN y None?

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 que una celda está vacía. En mi opinión, el valor leído en esa entrada del diccionario debe ser None pero en su lugar se asigna nan . Seguramente None es más descriptiva de una celda vacía, ya que tiene un valor nulo, mientras que nan simplemente dice que el valor leído no es un número.

¿Mi entendimiento es correcto, cuál es la diferencia entre None y nan ? ¿Por qué se asigna nan lugar de None ?

Además, mi comprobación de diccionario para las 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 al decir que no puedo usar esta comprobación para v . Supongo que es porque una variable entera o flotante, no una cadena está destinada a ser utilizada. Si esto es cierto, ¿cómo puedo verificar v para un caso de “celda vacía” / nan ?

NaN se utiliza como un marcador de posición para los datos faltantes en forma constante en los pandas , la consistencia es buena. Normalmente leo / traduzco NaN como “faltante” . También vea la sección ‘trabajar con datos faltantes’ en los documentos.

Wes escribe en los documentos “elección de NA-representación” :

Después de años de uso de producción, [NaN] ha demostrado ser, al menos en mi opinión, la mejor decisión, dado el estado de cosas en NumPy y Python en general. El valor especial NaN (Not-A-Number) se usa en todas partes como el valor de NA, y hay funciones de API isnull y no notnull que se pueden usar en todos los tipos para detectar valores de NA.

Por lo tanto, he elegido el enfoque de Pythonic “practicidad vence a la pureza” y he intercambiado la capacidad de NA de enteros para un enfoque mucho más simple de usar un valor especial en matrices de objetos y flotantes para denotar NA, y promover las matrices de enteros a flotantes cuando se deben introducir las NA.

Nota: el “gotcha” que la serie de entero que contiene datos faltantes se actualiza a flotadores .

En mi opinión, la razón principal para usar NaN (sobre Ninguno) es que puede almacenarse con el tipo de dato float64 de numpy, en lugar del tipo de objeto menos eficiente, consulte las promociones de tipo NA .

 # without forcing dtype it changes None to NaN! s_bad = pd.Series([1, None], dtype=object) s_good = pd.Series([1, np.nan]) In [13]: s_bad.dtype Out[13]: dtype('O') In [14]: s_good.dtype Out[14]: dtype('float64') 

Jeff comenta (abajo) sobre esto:

np.nan permite operaciones vectorizadas; es un valor flotante, mientras que None , por definición, fuerza el tipo de objeto, lo que básicamente inhabilita toda la eficiencia en el número.

Así que repita 3 veces rápido: objeto == malo, flotador == bueno

Dicho esto, muchas operaciones pueden seguir funcionando igual de bien con Ninguna contra NaN (pero quizás no sean compatibles, es decir, a veces pueden dar resultados sorprendentes ):

 In [15]: s_bad.sum() Out[15]: 1 In [16]: s_good.sum() Out[16]: 1.0 

Para contestar la segunda pregunta:
Debería usar pd.isnull y pd.notnull para probar los datos faltantes (NaN).

NaN se puede utilizar como un valor numérico en operaciones matemáticas, mientras que None no puede (o al menos no debería).

NaN es un valor numérico, como se define en el estándar de punto flotante IEEE 754 . None es un tipo interno de Python ( NoneType ) y sería más como “inexistente” o “vacío” que “numéricamente inválido” en este contexto.

El “síntoma” principal de esto es que, si realiza, digamos, un promedio o una sum en una matriz que contiene NaN, incluso una sola, obtendrá NaN como resultado …

Por otro lado, no puede realizar operaciones matemáticas utilizando None como operando.

Por lo tanto, dependiendo del caso, podría usar None como una forma de indicar a su algoritmo que no considere valores no válidos o inexistentes en los cálculos. Eso significaría que el algoritmo debería probar cada valor para ver si es None .

Numpy tiene algunas funciones para evitar que los valores de NaN contaminen sus resultados, como nansum y nan_to_num por ejemplo.

La función isnan() verifica si algo es “No es un número” y devolverá si una variable es un número, por ejemplo, isnan(2) devolvería false

El myVar is not None condicional myVar is not None devuelve si la variable está definida o no

Su matriz numpy usa isnan() porque está destinada a ser una matriz de números e inicializa todos los elementos de la matriz a NaN estos elementos se consideran “vacíos”

NaN stants para NO un número .
None podría representar a ninguno .