Skip to content

nan (pas un nombre) en Python

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