Skip to content

NumPy: Zeilen/Spalten mit fehlendem Wert (NaN) in ndarray entfernen

Python

Um Zeilen und Spalten mit fehlenden Werten NaN im NumPy-Array numpy.ndarray zu entfernen, überprüfen Sie NaN mit np.isnan() und extrahieren Sie Zeilen und Spalten, die NaN nicht enthalten, mit any() oder all() .

Dieser Artikel hat folgenden Inhalt.

  • Alle fehlenden Werte entfernen (NaN)
  • Zeilen mit fehlenden Werten entfernen (NaN)
  • Spalten mit fehlenden Werten entfernen (NaN)

Wenn SIE den fehlenden Wert durch einen anderen Wert ersetzen möchten, anstatt ihn zu löschen, lesen Sie den following Artikel.

In den following Artikeln erfahren SIE, wie SIE Zeilen und Spalten an beliebigen Positionen sowie Zeilen und Spalten löschen, die Bedingungen erfüllen.

Sie als Beispiel sterben folgende CSV mit fehlenden Daten mit np.genfromtxt().

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

Alle fehlenden Werte entfernen (NaN)

Mit np.isnan() can SIE ndarray abrufen, dessen fehlende Werte True und die anderen False sind.

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

Durch die Verwendung des Negationsoperators ~ für dieses ndarray und das Setzen von NaN auf False can die fehlenden Werte gelöscht Werden (= nicht fehlende Werte werden gesichert). Da die Anzahl der erhaltenen Elemente unterschiedlich ist, wird die Form des ursprünglichen Arrays nicht erhalten und abgeflacht.

print(~np.isnan(a))
# [[ True  True False  True]
#  [ True False False  True]
#  [ True  True  True  True]]

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

Zeilen mit fehlenden Werten entfernen (NaN)

Verwenden Sie zum Entfernen von Zeilen mit fehlenden Werten die Methode any(), die True zurückgibt, wenn es mindestens ein True in ndarray gibt.

Mit dem Argument axis=1 testet any(), ob es für jede Zeile mindestens ein True gibt.

print(np.isnan(a).any(axis=1))
# [ True  True False]

Verwenden Sie den Negationsoperator ~, um Zeilen ohne fehlende Werte auf True zu setzen.

print(~np.isnan(a).any(axis=1))
# [False False  True]

Durch Anwenden dieses booleschen Arrays auf die erste Dimension (= Zeile) des ursprünglichen Arrays werden die Zeilen mit den fehlenden Werten entfernt (= die Zeilen mit den fehlenden Werten werden extrahiert).

print(a[~np.isnan(a).any(axis=1), :])
# [[31. 32. 33. 34.]]

Sie können sterben Spaltenangabe : wie unten gezeigt weglassen.

print(a[~np.isnan(a).any(axis=1)])
# [[31. 32. 33. 34.]]

Wenn Sie nur die Zeilen entfernen möchten, in denen alle Elemente NaN sind, verwenden Sie all() anstelle von any().

Ein Beispiel mit all() ist unten gezeigt.

Spalten mit fehlenden Werten entfernen (NaN)

Dasselbe gilt, wenn Spalten mit fehlenden Werten entfernt werden.

Mit dem Argument axis=0 testet any(), ob es für jede Spalte mindestens ein True gibt. Verwenden Sie den Negationsoperator ~, um Spalten ohne fehlende Werte auf True zu setzen.

print(~np.isnan(a).any(axis=0))
# [ True False False  True]

Durch Anwenden dieses booleschen Arrays auf die zweite Dimension (= Spalte) des ursprünglichen Arrays werden die Spalten mit den fehlenden Werten entfernt (= die Spalten mit den fehlenden Werten werden extrahiert).

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
#  [21. 24.]
#  [31. 34.]]

Wenn Sie nur die Spalten entfernen möchten, in denen alle Elemente NaN sind, verwenden Sie all() anstelle von any().

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

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
#  [21. 24.]
#  [31. 34.]]

print(a[:, ~np.isnan(a).all(axis=0)])
# [[11. 12. 14.]
#  [21. nan 24.]
#  [31. 32. 34.]]