NaN est utilisé comme espace réservé pour les données manquantes de manière cohérente dans les pandas , la cohérence est bonne. Je lis / traduis habituellement NaN comme "manquant" . Consultez également la section «Utilisation des données manquantes» dans la documentation.
Wes écrit dans la documentation `` le choix de la représentation NA '' :
Après des années de production, l'utilisation de [NaN] s'est avérée, du moins à mon avis, la meilleure décision étant donné 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
et notnull
qui peuvent être utilisées dans les dtypes pour détecter les valeurs NA.
...
Ainsi, j'ai choisi l'approche pythonique «la praticité bat la pureté» et j'ai échangé la capacité NA entière pour une approche beaucoup plus simple consistant à utiliser une valeur spéciale dans les tableaux flottants et objets pour désigner NA, et en promouvant les tableaux entiers flottants lorsque les NA doivent être introduit.
Remarque: le "gotcha" que les séries entières contenant des données manquantes sont converties en flottants .
À mon avis, la principale raison d'utiliser NaN (sur None) est qu'il peut être stocké avec le type float64 de numpy, plutôt qu'avec le type d'objet moins efficace, voir les 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 flottante, tandis que None
, par définition, force le type d'objet, ce qui désactive fondamentalement toute efficacité dans numpy.
Alors répétez 3 fois vite: objet == mauvais, float == bon
Cela dit, de nombreuses opérations peuvent toujours fonctionner aussi bien avec None qu'avec NaN (mais peut-être ne sont pas prises en charge, c'est-à-dire qu'elles peuvent parfois donner des 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 devez utiliser pd.isnull
et pd.notnull
pour tester les données manquantes (NaN).
qwerty
n'est pas un nombre.