web-dev-qa-db-fra.com

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. une cellule est vide. À mon avis, la valeur lue dans cette entrée de dictionnaire devrait être None mais _ à la place, nan est attribué. Il est certain que None est plus descriptif qu'une cellule vide il a une valeur nulle, alors que nan dit simplement que la valeur lue n'est pas un nombre.

Ma compréhension est-elle correcte, que IS la différence entre None et nan?? Pourquoi nan est-il affecté au lieu de None ?

En outre, ma vérification du dictionnaire pour toutes les cellules vides a utilisé numpy.isnan():

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

Mais cela me donne une erreur en disant que je ne peux pas utiliser cette vérification pour v. J'imagine que c'est parce qu'un entier ou une variable float, pas une chaîne est censé être utilisé. Si cela est vrai, comment puis-je vérifier v pour une "cellule vide"/nan cas?

78
user1083734

NaN est utilisé comme paramètre fictif pour données manquantes systématiquement dans les pandas , la cohérence est bonne. J'ai l'habitude de lire/traduire NaN comme "manquant" . Voir également la section 'utilisation des données manquantes' dans la documentation.

Wes écrit dans la documentation 'choix de la représentation de NA' :

Après des années de production, [NaN] s’est avéré, du moins à mon avis, la meilleure décision compte tenu de l’état de la situation dans NumPy et Python en général. La valeur spéciale NaN (Not- A-Number) est utilisé partout en tant que valeur NA et il existe des fonctions d'API isnull et notnull qui peut être utilisé à travers les types de données pour détecter les valeurs NA.
...
Ainsi, j’ai choisi l’approche pythonique "l’opacité pratique batte la pureté" et la capacité NA échangée pour une approche beaucoup plus simple qui consiste à utiliser une valeur spéciale dans les tableaux float et object pour indiquer NA et pour promouvoir les tableaux entiers en flottant lorsque NA. doit être introduit.

Note: le "gotcha" que la série entière contenant les données manquantes est upcast en float .

À mon avis, la principale raison d'utiliser NaN (sur Aucun) est qu'il peut être stocké avec le type type float64 de numpy, plutôt que le type d'objet 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 commente (ci-dessous) à ce sujet:

np.nan permet des opérations vectorisées; C'est une valeur float, tandis que None, par définition, force le type d'objet, ce qui désactive fondamentalement toute efficacité dans numpy.

Répétez donc 3 fois vite: objet == mauvais, float == bon

Cela dit, de nombreuses opérations peuvent toujours fonctionner aussi bien avec None vs NaN (mais elles ne sont peut-être pas prises en charge, c'est-à-dire qu'elles peuvent parfois donner 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 et pd.notnull pour tester les données manquantes (NaN).

88
Andy Hayden

NaN peut être utilisé comme valeur numérique pour les opérations mathématiques, tandis que None ne peut pas (ou du moins ne devrait pas).

NaN est une valeur numérique, telle que définie dans norme à virgule flottante IEEE 754 . None est un interne Python tipe (NoneType) et ressemblerait davantage à "inexistant" ou "vide" qu'à "invalide numériquement" dans ce contexte.

Le principal "symptôme" de cela est que, si vous effectuez une moyenne ou une somme sur un tableau contenant NaN, même un seul, vous obtenez NaN à la suite ...

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

Ainsi, selon le cas, vous pouvez utiliser None pour indiquer à votre algorithme de ne pas prendre en compte des valeurs non valides ou inexistantes dans les calculs. Cela voudrait dire que l'algorithme devrait tester chaque valeur pour voir si c'est None.

Numpy a certaines fonctions pour éviter les valeurs NaN de contaminer vos résultats, telles que nansum et nan_to_num par exemple.

15
heltonbiker

La fonction isnan() vérifie si quelque chose correspond à "Pas un nombre" et indiquera si une variable est un nombre ou non. Par exemple, isnan(2) renverrait faux

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

Votre tableau numpy utilise isnan() car il est censé être un tableau de nombres et initialise tous les éléments du tableau sur NaN ces éléments sont considérés comme "vides".

3
Stephan