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 ?

62
demandé sur Cristian Ciupitu 2013-07-08 23:06:17

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 isnull et notnull qui 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.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 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).

63
répondu Andy Hayden 2017-11-22 18:10:46

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.

8
répondu heltonbiker 2013-07-08 19:16:25

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

2
répondu Stephan 2013-07-10 16:05:16

NaN stants pour PAS un nombre .

None peut signifier n'importe quel .

-3
répondu diegoaguilar 2013-07-08 19:09:09