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

, Es mi entendimiento correcto, ¿cuál ES la diferencia entre None y nan? ¿Por qué se asigna nan en lugar de None?

Además, mi diccionario de verificación 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 diciendo 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 comprobar v para una "celda vacía"/nan caso?

Author: Cristian Ciupitu, 2013-07-08

4 answers

NaN se usa como marcador de posición para datos faltantes consistentemente en pandas, la consistencia es buena. Normalmente leo / traduzco NaN como "missing". También vea la sección 'trabajar con datos faltantes' en los documentos.

Wes escribe en los documentos 'elección de representación NA':

Después de años de uso de la producción [NaN] ha demostrado, al menos en mi opinión, para ser la mejor decisión dado el estado de las cosas en NumPy y Python en general. El valor especial NaN (Not-A-Number) se usa en todas partes como valor NA, y hay funciones APIisnull y notnull que se puede utilizar a través de los dtypes para detectar valores de NA.
...
Por lo tanto, he elegido el enfoque pitónico "la practicidad supera la pureza" y cambié la capacidad de entero NA por un enfoque mucho más simple de usar un valor especial en matrices flotantes y de objetos para denotar NA, y promover matrices enteras a flotar cuando NAs debe ser presentado.

Nota: el "gotcha" que la Serie entera que contiene datos faltantes son upcast a flotadores.

En mi opinión, la razón principal para usar NaN (sobre None) es que se puede almacenar con el dtype float64 de numpy, en lugar del dtype de objeto menos eficiente, ver 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, que básicamente deshabilita toda eficiencia en numpy.

Así que repite 3 veces rápido: object = = bad, float = = good

Diciendo que, muchas operaciones todavía pueden funcionar igual de bien con None vs NaN (pero tal vez no son 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 responder a la segunda pregunta:
Usted debe estar utilizando pd.isnull y pd.notnull a prueba de datos faltantes (NaN).

 63
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 18:10:46

NaN puede ser utilizado 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, tal como se define en 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 inválido" en este contexto.

El principal "síntoma" de esto es que, si realizas, digamos, un promedio o una suma en una matriz que contiene NaN, incluso una sola, obtienes NaN como resultado...

Por otro lado, no se pueden realizar operaciones matemáticas usando None como operando.

Así que, dependiendo del caso, podría usar 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 es None.

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

 8
Author: heltonbiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-08 19:16:25

La función isnan() comprueba si algo es "No un Número" y devolverá si una variable es o no un número, por ejemplo isnan(2) devolverá false

El 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 y inicializa todos los elementos de la matriz a NaN estos elementos se consideran "vacíos"

 2
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-10 16:05:16

NaN stants for NOT a number.
None podría representar cualquiera.

 -3
Author: diegoaguilar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-08 19:09:09