135 votes

Quelle est la différence entre NaN et None ?

Je lis deux colonnes d'un fichier csv en utilisant pandas. readcsv() puis en affectant les valeurs à un dictionnaire. Les colonnes contiennent des chaînes de chiffres et de lettres. Il arrive parfois qu'une cellule soit vide. A mon avis, la valeur lue à cette entrée du dictionnaire devrait être None mais à la place nan est attribué. Sûrement None est plus descriptif d'une cellule vide car elle a une valeur nulle, alors que nan indique simplement que la valeur lue n'est pas un nombre.

Si je comprends bien, quelle EST la différence entre None y nan ? Pourquoi le nan attribué au lieu de None ?

De plus, mon dictionnaire vérifie si les cellules sont vides en utilisant numpy.isnan() :

for k, v in my_dict.iteritems():
    if np.isnan(v):

Mais cela me donne un message d'erreur disant que je ne peux pas utiliser ce contrôle pour v . Je suppose que c'est parce qu'une variable entière ou flottante, et non une chaîne de caractères, est censée être utilisée. Si c'est vrai, comment puis-je vérifier v pour une "cellule vide"/ nan cas ?

142voto

Andy Hayden Points 38010

NaN est utilisé en tant que placeholder pour données manquantes constamment dans les pandas La cohérence est bonne. Je lis/traduis généralement NaN comme "manquant" . _Voir aussi le travailler avec des données manquantes dans la documentation._

Wes écrit dans les docs choix de la représentation de l'AN :

Après des années d'utilisation en production, [NaN] s'est avéré, du moins à mon avis, être la meilleure décision compte tenu de l'état des choses dans NumPy et Python en général. La valeur spéciale NaN (Not-A-Number) est utilisée partout comme valeur NA, et il existe des fonctions API isnull y notnull qui peut être utilisé à travers les dtypes pour détecter les valeurs NA.
...
Ainsi, j'ai choisi l'approche pythonique "l'aspect pratique l'emporte sur la pureté" et j'ai échangé la capacité de NA des entiers contre une approche beaucoup plus simple consistant à utiliser une valeur spéciale dans les tableaux de flottants et d'objets pour indiquer NA, et à promouvoir les tableaux d'entiers en flottants lorsque des NA doivent être introduits.

Remarque : le "Les séries de nombres entiers contenant des données manquantes sont converties en nombres flottants. .

À mon avis, la principale raison d'utiliser NaN (plutôt que None) est qu'il peut être stocké avec le dtype float64 de numpy, plutôt qu'avec le dtype object, moins efficace, voir Promotions de type 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 fait des commentaires (ci-dessous) à ce sujet :

np.nan permet d'effectuer des opérations vectorielles ; il s'agit d'une valeur flottante, tandis que l'option None par définition, force le type d'objet, ce qui désactive fondamentalement toute efficacité dans numpy.

Donc répétez 3 fois rapidement : objet==mauvais, flotteur==bon.

Cela dit, de nombreuses opérations peuvent fonctionner tout aussi bien avec None ou NaN (mais ne sont peut-être pas prises en charge, c'est-à-dire qu'elles peuvent parfois donner des résultats différents). résultats surprenants ):

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

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

Pour répondre à la deuxième question :
Vous devriez utiliser pd.isnull y pd.notnull pour tester les données manquantes (NaN).

26voto

heltonbiker Points 4725

NaN peut être utilisé comme une valeur numérique lors d'opérations mathématiques, alors que None ne peut pas (ou du moins ne devrait pas).

NaN est une valeur numérique, telle que définie dans Norme de virgule flottante IEEE 754 . None est un type Python interne ( NoneType ) et serait plus proche de "inexistant" ou "vide" que de "numériquement invalide" dans ce contexte.

Le principal "symptôme" de cela est que, si vous effectuez, disons, une moyenne ou une somme sur un tableau contenant NaN, même un seul, vous obtenez NaN comme résultat...

D'autre part, vous ne pouvez pas effectuer d'opérations mathématiques en utilisant None comme opérande.

Donc, selon le cas, vous pourriez utiliser None comme un moyen d'indiquer à votre algorithme de ne pas prendre en compte les valeurs invalides ou inexistantes lors des calculs. Cela signifierait que l'algorithme devrait tester chaque valeur pour voir si elle est None .

Numpy dispose de quelques fonctions pour éviter que les valeurs NaN ne contaminent vos résultats, telles que nansum y nan_to_num par exemple.

3voto

Stephan Points 2942

La fonction isnan() vérifie si quelque chose est "Not A Number" et renvoie si une variable est un nombre ou non, par exemple isnan(2) retournerait faux

Le conditionnel myVar is not None retourne si la variable est définie ou non

Votre tableau numpy utilise isnan() parce qu'il est destiné à être un tableau de nombres et qu'il initialise tous les éléments du tableau à la valeur NaN ces éléments sont considérés comme "vides".

0voto

eswara amirthan s Points 107

Voici les différences :

  • nan appartient à la classe float
  • None appartient à la classe NoneType

J'ai trouvé l'article ci-dessous très utile : https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X