Je lis deux colonnes d'un fichier csv en utilisant des pandas readcsv()
, puis j'attribue les valeurs à un dictionnaire. Les colonnes contiennent des chaînes de chiffres et de lettres. Parfois, il y a des cas où une cellule est vide. À mon avis, la valeur lue dans cette entrée de dictionnaire devrait être, None
mais nan
est affectée à la place. None
Est sûrement plus descriptif d'une cellule vide car elle a une valeur nulle, alors nan
que dit simplement que la valeur lue n'est pas un nombre.
Ma compréhension est-elle correcte, quelle est la différence entre None
et nan
? Pourquoi est nan
attribué au lieu de None
?
De plus, ma vérification du dictionnaire pour toutes les cellules vides utilise numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
Mais cela me donne une erreur disant que je ne peux pas utiliser cette vérification v
. Je suppose que c'est parce qu'une variable entière ou flottante, et non une chaîne, est destinée à être utilisée. Si cela est vrai, comment puis-je v
rechercher une "cellule vide" / un nan
cas?
qwerty
n'est pas un nombre.None
serait sûrement une meilleure description de la valeur d'une cellule vide.Réponses:
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 '' :
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 .
Jeff commente (ci-dessous) à ce sujet:
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 ):
Pour répondre à la deuxième question:
Vous devez utiliser
pd.isnull
etpd.notnull
pour tester les données manquantes (NaN).la source
np.nan
permet des opérations vectorisées; c'est une valeur flottante, alors queNone
par définition force leobject
type, et désactive fondamentalement toute efficacité dans numpy, alors répétez 3 fois vite:object==bad, float==good
<NA>
aussi unnp.nan
?NaN
peut être utilisé comme valeur numérique sur des opérations mathématiques, alors queNone
ne peut pas (ou du moins ne devrait pas).NaN
est une valeur numérique, telle que définie dans la norme à virgule flottante IEEE 754 .None
est un type Python interne (NoneType
) et ressemblerait plus à «inexistant» ou «vide» qu'à «numériquement invalide» dans ce contexte.Le principal "symptôme" de cela est que, si vous effectuez, par exemple, une moyenne ou une somme sur un tableau contenant NaN, même un seul, vous obtenez NaN en conséquence ...
En revanche, vous ne pouvez pas effectuer d'opérations mathématiques en utilisant
None
comme opérande.Ainsi, selon le cas, vous pouvez utiliser
None
comme moyen de dire à votre algorithme de ne pas prendre en compte des valeurs invalides ou inexistantes dans les calculs. Cela signifierait que l'algorithme devrait tester chaque valeur pour voir si c'est le casNone
.Numpy a certaines fonctions pour éviter que les valeurs NaN ne contaminent vos résultats, comme
nansum
etnan_to_num
par exemple.la source
df=pd.readcsv('file.csv')
me donne-t-il desNaN
valeurs pour les cellules vides et nonNone
? Autant que je sache, les pd.DataFrames ne sont pas exclusifs aux nombres.dtype
, donc les valeurs invalides dedtype=float
doivent être représentées par des valeurs numériques, ce quiNaN
est etNone
n'est pas (None
est deNoneType
).na
argument, qui vous permet de décider quelle valeur vous allez utiliser pour remplacer les valeurs non disponiblesLa fonction
isnan()
vérifie si quelque chose est "Not A Number" et retournera si oui ou non une variable est un nombre, par exempleisnan(2)
retournerait falseLe conditionnel
myVar is not None
renvoie si la variable est définie ou nonVotre tableau numpy utilise
isnan()
parce qu'il est destiné à être un tableau de nombres et qu'il initialise tous les éléments du tableau àNaN
ces éléments sont considérés comme «vides»la source
isnan(2)
retourneraisFalse
, car 2 n'est pas un NaN.numpy.empty
n'initialise pas les valeurs du tableau surNaN
. Il n'initialise tout simplement pas du tout les valeurs.None
-ness estmyVar is not None
, nonmyVar != None
.np.isnan()
n'est pas implémenté pour les variables chaîne, donc si vous lui passez une chaîne, cela plantera. Mieux vaut utiliserpd.isnull
qui fonctionne avec des chaînes.Voici les différences:
nan
appartient à la classefloat
None
appartient à la classeNoneType
J'ai trouvé l'article ci-dessous très utile: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
la source
NaN
stants pour PAS un nombre .None
pourrait représenter tout .la source