
Per rimuovere righe e colonne mancanti NaN nell’array NumPy numpy.ndar, controllare NaN conp.isnan() ed estrarre righe e colonne contenenti che non contengono NaN con any() o all() .
In questo articolo vengono descritti i seguenti contenuti.
- Elimina tutti i valori mancanti (NaN)
- Rimuovere le righe contenenti valori mancanti (NaN)
- Rimuovere le colonne contenenti valori mancanti (NaN)
Se si desidera sostituire il valore mancante con un altro valore invece di eliminarerlo, vedere il seguente articolo.
Vedere gli articoli seguenti per come eliminare righe e colonne in qualsiasi posizione e righe e colonne che soddisfano le condizioni.
Ad esempio, leggi il seguente CSV con dati mancanti con 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.]]
Elimina tutti i valori mancanti (NaN)
Con np.isnan(), puoi ottenere ndarray i cui valori mancanti sono True e gli altri sono False.
print(np.isnan(a))
# [[False False True False]
# [False True True False]
# [False False False False]]
utilizzando l’operatore di negazione ~ per questo ndarray e impostando NaN su False, i valori mancanti possono essere eliminati (= vengono estratti i valori non mancanti). Poiché il numero degli elementi rimanenti è diverso, la forma dell’array originale non viene mantenuta e viene appiattita.
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.]
Rimuovere le righe contenenti valori mancanti (NaN)
Per rimuovere le righe contenenti valori mancanti, utilizzare il metodo any() che restituisce True se è presente almeno un True in ndarray.
Con l’argomento axis=1, any() verifica se esiste almeno un True per ogni riga.
print(np.isnan(a).any(axis=1))
# [ True True False]
Utilizzare l’operatore di negazione ~ per creare righe senza valori mancanti Vero.
print(~np.isnan(a).any(axis=1))
# [False False True]
Applicando questo array booleano alla prima dimensione (= riga) dell’array originale, le righe contenenti i valori mancanti vengono rimosse (= vengono estratte le righe contenenti i valori mancanti).
print(a[~np.isnan(a).any(axis=1), :])
# [[31. 32. 33. 34.]]
È possibile omettere la specifica della colonna: come mostrato di seguito.
print(a[~np.isnan(a).any(axis=1)])
# [[31. 32. 33. 34.]]
Se tutti vuoi rimuovere solo le righe in cui gli elementi sono NaN, usa all() invece di any().
Di seguito è mostrato un esempio che utilizza all().
Rimuovere le colonne contenenti valori mancanti (NaN)
Lo stesso vale per la rimozione di colonne contenenti valori mancanti.
Con l’argomento axis=0, any() verifica se esiste almeno un True per ogni colonna. Utilizzare l’operatore di negazione ~ per creare colonne senza valori mancanti Vero.
print(~np.isnan(a).any(axis=0))
# [ True False False True]
Applicando questo array booleano alla seconda dimensione (= colonna) dell’array originale, le colonne contenenti i valori mancanti vengono rimosse (= vengono estratte le colonne contenenti i valori mancanti).
print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
# [21. 24.]
# [31. 34.]]
Se tutti vuoi rimuovere solo le colonne in cui gli elementi sono NaN, usa all() invece di 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.]]