Quelle est la différence entre NaN et aucune?
 je suis en train de lire deux colonnes d'un fichier csv en utilisant pandas readcsv()  et en assignant les valeurs à un dictionnaire. Les colonnes contiennent des chaînes de chiffres et de lettres. Il arrive parfois qu'une cellule soit vide. À mon avis, la valeur lue dans cette entrée du dictionnaire devrait être  None , mais plutôt  nan . Sûrement  None  est plus descriptif d'une cellule vide comme il a une valeur nulle, tandis que  nan  dit juste que la valeur lue n'est pas une nombre.  
 est-ce que ma compréhension est correcte, Quelle est la différence entre None et nan ? Pourquoi nan est-il assigné au lieu de None ?  
  en outre, mon dictionnaire vérifier pour toutes les cellules vides a été 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 ce chèque pour v . Je suppose que c'est parce qu'une variable entière ou flottante, pas une chaîne est destinée à être utiliser. Si c'est vrai, Comment puis-je cocher  v  pour un cas "empty cell"/  nan ?  
4 réponses
NaN est utilisé comme un espace réservé pour données manquantes constamment pandas , la cohérence est bonne. J'ai l'habitude de lire / traduire NaN comme "manquant . Voir aussi la section " travailler avec des données manquantes " dans les documents.
Wes écrit dans les docs 'choix de la représentation NA ' :
après des années d'utilisation de la production [NaN] s'est avéré, du moins à mon avis, être la meilleure décision étant donné l'état des choses à NumPy et Python en général. La valeur spéciale NaN (non-A-Number) est utilisée partout comme valeur NA, et il y a des fonctions API
isnulletnotnullqui peuvent être utilisées à travers les dtypes pour détecter les valeurs NA.
...
Ainsi, j'ai choisi l'approche pythonique "praticity beats purity" et négocié la capacité de NA entier pour une approche beaucoup plus simple d'utiliser une valeur spéciale dans les flotteurs et les tableaux d'objets pour dénoter NA, et la promotion de tableaux entiers à flotter lorsque NAs doit être introduit.
Remarque: le "gotcha" que l'entier de la Série contenant les données manquantes sont sortie de flotte .
In à mon avis, La principale raison d'utiliser NaN (sur Aucun) est qu'il peut être stocké avec float64 dtype de num PY, plutôt que l'objet moins efficace dtype, 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.nanpermet des opérations vectorisées; c'est une valeur flottante, tandis queNone, par définition, force le type d'objet, ce qui l'efficacité dans numpy.donc répéter 3 fois vite: objet = = mauvais, flottant = = bon
disant que, beaucoup d'opérations peuvent encore fonctionner aussi bien avec aucun vs NaN (mais peut-être ne sont pas soutenus i.e. ils 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 devez utiliser     pd.isnull     et     pd.notnull     pour tester les données manquantes (NaN).  
   NaN  peut être utilisé comme valeur numérique sur 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    IEEE 754 floating-point standard   .
  None est une flèche interne de Python ( NoneType ) et serait plus comme" inexistant "ou" vide "que" numériquement invalide " dans ce contexte.  
le principal "symptôme" en est que, si vous effectuez, disons, d'une moyenne ou d'une somme sur un tableau contenant NaN, même un seul, vous obtenez NaN...
 d'autre part, vous ne pouvez pas effectuer des opérations mathématiques en utilisant None  comme opérande.  
 ainsi, selon le cas, vous pourriez utiliser None  comme un moyen de dire à votre algorithme de ne pas considérer les valeurs invalides ou inexistantes sur les calculs. Cela signifierait que l'algorithme devrait tester chaque valeur pour voir si elle est  None  .  
  Numpy a certaines fonctions pour éviter que les valeurs de NaN contaminent vos résultats, comme  nansum  et  nan_to_num  par exemple.  
 la fonction   isnan()   vérifie si quelque chose n'est pas" un nombre "et retournera si oui ou non une variable est un nombre, par exemple  isnan(2)  retournerait false  
  conditionnel  myVar is not None  retourne si oui ou non la variable est définie  
  votre tableau numpy utilise  isnan()  parce qu'il est destiné à être un tableau de nombres et il initialise tous les éléments du tableau à  NaN  ces les éléments sont considérés comme "vides 
   NaN  stants pour    PAS un nombre    .  
      None  peut signifier       n'importe quel      .