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).