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?
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
etnotnull
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 queNone
, 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).
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.
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".