
En Python, le type flottant a nan. nan signifie « pas un nombre » et est défini par la norme à virgule flottante IEEE 754.
Cet article décrit le contenu suivant.
- nan est une valeur flottante en Python
- Créé en:
float('nan'), math.nan, numpy.nan - Vérifiez si une valeur est nan :
math.isnan(), np.isnan() - Comportement des opérateurs de comparaison (<, >, ==, ! =) avec nan
- Vérifier nan dans l’instruction if
- Supprimer et remplacer nan dans une liste
- Opérations avec nan
Consultez les articles suivants pour savoir comment supprimer et remplacer nan dans NumPy et pandas.
nan est une valeur flottante en Python
En Python, le type flottant a nan. Vous pouvez créer nan avec float(‘nan’). D’autres méthodes de création sont décrites plus loin.
import math
import numpy as np
import pandas as pd
print(float('nan'))
# nan
print(type(float('nan')))
# <class 'float'>
Par exemple, si vous lisez un fichier CSV dans NumPy ou pandas, les valeurs manquantes sont représentées par nan (NaN dans pandas).
a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. 33. 34.]]
df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')[:3]
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
Créé en:float('nan'), math.nan, numpy.nan
Comme décrit ci-dessus, vous pouvez créer nan avec float(‘nan’). Il est insensible à la casse, vous pouvez donc utiliser ‘NaN’ et ‘NAN’.
print(float('nan'))
# nan
print(float('NaN'))
# nan
print(float('NAN'))
# nan
De plus, nan peut être créé par math (bibliothèque standard) et NumPy ; NaN et NAN sont définis comme des alias dans NumPy.
print(math.nan)
# nan
print(np.nan)
# nan
print(np.NaN)
# nan
print(np.NAN)
# nan
Ils sont équivalents quelle que soit la méthode que vous utilisez pour créer.
Vérifiez si une valeur est nan :math.isnan(), np.isnan()
Vous pouvez vérifier si une valeur est nan ou non avec math.isnan().
print(math.isnan(float('nan')))
# True
print(math.isnan(math.nan))
# True
print(math.isnan(np.nan))
# True
numpy.isnan() est également fourni.
En plus des valeurs scalaires, des objets de type tableau tels que des listes et des tableaux NumPy ndarray peuvent être spécifiés comme arguments.
print(np.isnan(float('nan')))
# True
print(np.isnan([float('nan'), math.nan, np.nan, 0]))
# [ True True True False]
pandas.DataFrame et Series ont la méthode isna() et son alias isnull(), qui renvoient True pour nan et None.
Une erreur est générée si None est spécifié pour math.isnan() ou np.isnan().
Comportement des opérateurs de comparaison (<, >, ==, ! =) avec nan
Lors de la comparaison avec nan, <, >, ==, <= et >= renvoient toujours False et != renvoie toujours True.
print(10 < float('nan'))
# False
print(10 > float('nan'))
# False
print(10 == float('nan'))
# False
print(10 != float('nan'))
# True
Il en va de même pour les comparaisons nan et nan. Notez que == et != donnent des résultats contre-intuitifs.
Toute comparaison ordonnée d’un nombre à une valeur qui n’est pas un nombre est fausse. Une implication contre-intuitive est que les valeurs qui ne sont pas un nombre ne sont pas égales à elles-mêmes. Par exemple, si x = float(‘NaN’), 3 < x, x < 3 et x == x sont tous faux, tandis que x != x est vrai. Ce comportement est conforme à IEEE 754.
6. Expressions – Comparaisons de valeurs — Documentation Python 3.10.2
print(float('nan') == float('nan'))
# False
print(float('nan') != float('nan'))
# True
Pour vérifier si une valeur est nan, utilisez math.isnan() et numpy.isnan() au lieu de ==.
Vérifier nan dans l’instruction if
En Python, les objets autres que True et False sont également considérés comme vrais ou faux dans l’expression conditionnelle de l’instruction if. Par exemple, la chaîne vide » ou le nombre 0 est considéré comme faux, et les autres chaînes ou nombres sont considérés comme vrais.
Comme vous pouvez le voir avec bool(), nan est évalué comme True.
print(bool(float('nan')))
# True
Utilisez math.isnan() ou numpy.isnan().
x = float('nan')
if math.isnan(x):
print('This is nan.')
else:
print('This is not nan.')
# This is nan.
x = 100
if math.isnan(x):
print('This is nan.')
else:
print('This is not nan.')
# This is not nan.
Supprimer et remplacer nan dans une liste
Si vous souhaitez supprimer ou remplacer nan dans une liste, utilisez des compréhensions de liste, des expressions conditionnelles (opérateurs ternaires) et math.isnan(), numpy.isnan().
l = [float('nan'), 0, 1, 2]
print(l)
# [nan, 0, 1, 2]
print([x for x in l if not math.isnan(x)])
# [0, 1, 2]
print([-100 if math.isnan(x) else x for x in l])
# [-100, 0, 1, 2]
Utilisez simplement math.isnan() et numpy.isnan() pour vérifier, et le concept est le même que les autres cas de suppression et de remplacement de valeurs. Voir l’article suivant pour plus de détails.
Consultez les articles suivants pour savoir comment supprimer et remplacer nan dans NumPy et pandas.
Opérations avec nan
Des opérations telles que +, -, *, / et ** avec nan donnent nan.
print(float('nan') + 100)
# nan
print(float('nan') - 100)
# nan
print(float('nan') - 100)
# nan
print(float('nan') / 100)
# nan
print(float('nan') ** 100)
# nan
