Skip to content

NumPy : Remplacer NaN (np.nan) dans ndarray

Dans NumPy, pour remplacer les valeurs manquantes NaN (np.nan) dans ndarray par d’autres nombres, utilisez np.nan_to_num() ou np.isnan().

Cet article décrit le contenu suivant.

  • Valeur manquante NaN (np.nan) dans NumPy
  • Spécifiez l’argument fill_values ​​de np.genfromtxt()
  • Remplacez NaN par np.nan_to_num()
  • Remplacez NaN par np.isnan()

Si vous souhaitez supprimer la ligne ou la colonne contenant la valeur manquante au lieu de la remplacer, consultez l’article suivant.

Valeur manquante NaN (np.nan) dans NumPy

Lorsque vous lisez un fichier CSV avec np.genfromtxt(), par défaut, la donnée manquante est considérée comme une valeur manquante NaN (Not a Number).

Lors de la sortie avec print(), il est imprimé en tant que nan.

import numpy as np

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. 33. 34.]]

Si vous souhaitez générer explicitement NaN, utilisez np.nan ou float(‘nan’). Vous pouvez également importer le module math de la bibliothèque standard et utiliser math.nan. Ils sont tous les mêmes.

a_nan = np.array([0, 1, np.nan, float('nan')])
print(a_nan)
# [ 0.  1. nan nan]

Étant donné que la comparaison des valeurs manquantes avec == renvoie False, utilisez np.isnan() ou math.isnan() pour vérifier si la valeur est NaN ou non.

print(np.nan == np.nan)
# False

print(np.isnan(np.nan))
# True

np.isnan() vérifie si chaque élément de ndarray est un NaN ou non.

print(a_nan == np.nan)
# [False False False False]

print(np.isnan(a_nan))
# [False False  True  True]

Spécifiez l’argument fill_values ​​de np.genfromtxt()

Si les données d’un fichier CSV sont manquantes, vous pouvez remplir la partie manquante avec n’importe quelle valeur en spécifiant l’argument fill_values ​​lors de sa lecture avec np.genfromtxt().

Par exemple, si vous souhaitez remplir NaN avec 0 :

a_fill = np.genfromtxt('data/src/sample_nan.csv', delimiter=',', filling_values=0)
print(a_fill)
# [[11. 12.  0. 14.]
#  [21.  0.  0. 24.]
#  [31. 32. 33. 34.]]

Remplacez NaN par np.nan_to_num()

Vous pouvez utiliser np.nan_to_num() pour remplacer NaN.

Notez que np.nan_to_num() remplace également infinity inf. Voir l’article suivant pour plus de détails.

Si vous spécifiez ndarray comme premier argument de np.nan_to_num(), un nouveau ndarray est créé avec les valeurs manquantes remplacées par 0 par défaut. Le ndarray d’origine n’est pas modifié.

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(np.nan_to_num(a))
# [[11. 12.  0. 14.]
#  [21.  0.  0. 24.]
#  [31. 32. 33. 34.]]

print(a)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. 33. 34.]]

Si le deuxième argument copy est défini sur False, le ndarray d’origine est modifié.

print(np.nan_to_num(a, copy=False))
# [[11. 12.  0. 14.]
#  [21.  0.  0. 24.]
#  [31. 32. 33. 34.]]

print(a)
# [[11. 12.  0. 14.]
#  [21.  0.  0. 24.]
#  [31. 32. 33. 34.]]

Dans NumPy version 1.17 ou ultérieure, la valeur à remplacer peut être spécifiée par l’argument nan.

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(np.nan_to_num(a, nan=-1))
# [[11. 12. -1. 14.]
#  [21. -1. -1. 24.]
#  [31. 32. 33. 34.]]

Vous pouvez remplacer NaN par la moyenne des éléments qui ne manquent pas de valeurs avec np.nanmean().

print(np.nanmean(a))
# 23.555555555555557

print(np.nan_to_num(a, nan=np.nanmean(a)))
# [[11.         12.         23.55555556 14.        ]
#  [21.         23.55555556 23.55555556 24.        ]
#  [31.         32.         33.         34.        ]]

Dans les versions où l’argument nan n’est pas implémenté, vous pouvez remplacer NaN par une valeur autre que 0 de la manière suivante.

Remplacez NaN par np.isnan()

Vous pouvez utiliser np.isnan() pour vérifier si les éléments de ndarray sont NaN ou non.

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(np.isnan(a))
# [[False False  True False]
#  [False  True  True False]
#  [False False False False]]

À l’aide de ce résultat, vous pouvez attribuer n’importe quelle valeur à l’élément de valeur manquant.

Si vous souhaitez remplacer NaN par 0 :

a[np.isnan(a)] = 0
print(a)
# [[11. 12.  0. 14.]
#  [21.  0.  0. 24.]
#  [31. 32. 33. 34.]]

Vous pouvez également utiliser np.nanmean() pour remplacer NaN par la valeur moyenne.

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
a[np.isnan(a)] = np.nanmean(a)
print(a)
# [[11.         12.         23.55555556 14.        ]
#  [21.         23.55555556 23.55555556 24.        ]
#  [31.         32.         33.         34.        ]]