Skip to content

NumPy: Ersetzen von NaN (np.nan) in ndarray

Python

Um in NumPy fehlende Werte NaN (np.nan) in ndarray durch andere Zahlen zu ersetzen, verwenden Sie np.nan_to_num() oder np.isnan().

Dieser Artikel hat folgenden Inhalt.

  • Fehlender Wert NaN (np.nan) in NumPy
  • Geben Sie das fill_values-Argument von np.genfromtxt() an
  • Ersetzen Sie NaN durch np.nan_to_num()
  • Ersetzen Sie NaN durch np.isnan()

Wenn SIE die Zeile oder Spalte mit dem fehlenden Wert löschen möchten, anstatt ihn zu ersetzen, lesen Sie den folgenden Artikel.

Fehlender Wert NaN (np.nan) in NumPy

Wenn Sie eine CSV-Datei mit np.genfromtxt() lesen, werden die fehlenden Daten standardmäßig als fehlender Wert NaN (Not a Number) betrachtet.

Bei der Ausgabe mit print() wird es als nan ausgegeben.

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.]]

Wenn Sie NaN explizit generieren möchten, verwenden Sie np.nan oder float(’nan‘). Sie können auch das Mathematikmodul der Standardbibliothek importieren und math.nan verwenden. Sie sind alle gleich.

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

Da der Vergleichr Werte mit == False zurückgibt, verwenden SIE np.isnan() oder math.isnan(), um zu prüfen, ob der Wert NaN ist oder nicht.

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

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

np.isnan() prüft, ob jedes Element von ndarray ein NaN ist oder nicht.

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

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

Geben Sie das fill_values-Argument von np.genfromtxt() an

Wenn die Daten einer CSV-Datei fehlen, kann SIE den fehlenden Teil mit einem beliebigen Wert füllen, Sie dafür beim Lesen mit np.genfromtxt() das Argument fill_values ​​angeben.

Wenn Sie beispielsweise NaN mit 0 füllen möchten:

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.]]

Ersetzen Sie NaN durch np.nan_to_num()

Sie können np.nan_to_num() verwenden, um NaN zu ersetzen.

Beachten Sie, dass np.nan_to_num() auch unendlich inf ersetzt. Nichts finden Sie im following Artikel.

Wenn Sie ndarray als erstes Argument von np.nan_to_num() ersetzen, wird ein neues ndarray erstellt, bei dem fehlende Werte standardmäßig durch 0 werden. Das ursprüngliche ndarray wird nicht geändert.

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.]]

Wenn das zweite Argument copy auf False gesetzt ist, wird das ursprüngliche ndarray geändert.

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.]]

Ab NumPy-Version 1.17 kann der zu ersetzende Wert durch das Argument nan angegeben werden.

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.]]

Sie können NaN mit np.nanmean() durch den Durchschnitt der Elemente ersetzen, denen keine Werte fehlen.

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.        ]]

In Versionen, in denen das Argument nan nicht implementiert ist, kann SIE NaN auf folgende Weise durch einen anderen Wert als 0 ersetzen.

Ersetzen Sie NaN durch np.isnan()

Sie können np.isnan() verwenden, um zu prüfen, ob Elemente von ndarray NaN sind oder nicht.

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]]

Mit diesem Ergebnis können Sie dem fehlenden Wertelement einen beliebigen Wert zuweisen.

Wenn Sie NaN durch 0 ersetzen möchten:

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

Sie können auch np.nanmean() verwenden, um NaN durch den Durchschnittswert zu ersetzen.

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.        ]]