Rimuovi i valori nan da un array NumPy
-
Rimuovi i valori nan utilizzando i metodi
logical_not()
eisnan()
in NumPy -
Rimuovi i valori nan utilizzando il metodo
isfinite()
in NumPy -
Rimuovere i valori nan utilizzando il metodo
math.isnan
-
Rimuovere i valori nan utilizzando il metodo
pandas.isnull
Questo articolo discuterà alcune funzioni integrate di NumPy che puoi usare per eliminare i valori nan
.
Rimuovi i valori nan utilizzando i metodi logical_not()
e isnan()
in NumPy
La funzione logical_not()
è usata per applicare un NOT
logico agli elementi di un array. La funzione isnan()
è una funzione booleana che controlla se un elemento è nan
oppure no.
Usando la funzione isnan()
, possiamo creare un array booleano che ha False
per tutti i valori non nan
e True
per tutti i valori nan
. Successivamente, utilizzando la funzione logical_not()
, possiamo convertire True
in False
e viceversa.
Infine, usando l’indicizzazione booleana, possiamo filtrare tutti i valori non nan
dall’array NumPy originale. Tutti gli indici con True
come valore verranno usati per filtrare l’array NumPy.
Per saperne di più su queste funzioni in modo approfondito, fare riferimento alla loro documentazione ufficiale e qui, rispettivamente.
Fare riferimento al seguente frammento di codice per la soluzione.
import numpy as np
myArray = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
output1 = myArray[np.logical_not(np.isnan(myArray))] # Line 1
output2 = myArray[~np.isnan(myArray)] # Line 2
print(myArray)
print(output1)
print(output2)
Produzione:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
La Line 2
è una versione semplificata della Line 1
.
Rimuovi i valori nan utilizzando il metodo isfinite()
in NumPy
Come suggerisce il nome, la funzione isfinite()
è una funzione booleana che controlla se un elemento è finito o meno. Può anche controllare valori finiti in un array e restituisce un array booleano per lo stesso. L’array booleano memorizzerà False
per tutti i valori nan
e True
per tutti i valori finiti.
Useremo questa funzione per recuperare un array booleano per l’array di destinazione. Utilizzando l’indicizzazione booleana, filtreremo tutti i valori finiti. Anche in questo caso, come accennato in precedenza, gli indici con valori True
verranno utilizzati per filtrare l’array.
Ecco il codice di esempio.
import numpy as np
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
output1 = myArray1[np.isfinite(myArray1)]
output2 = myArray2[np.isfinite(myArray2)]
output3 = myArray3[np.isfinite(myArray3)]
print(myArray1)
print(myArray2)
print(myArray3)
print(output1)
print(output2)
print(output3)
Produzione:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
Per saperne di più su questa funzione, fare riferimento alla documentazione ufficiale
Rimuovere i valori nan utilizzando il metodo math.isnan
Oltre a queste due soluzioni NumPy, ci sono altri due modi per rimuovere i valori nan
. Questi due modi implicano la funzione isnan()
dalla libreria math
e la funzione isnull
dalla libreria pandas
. Entrambe queste funzioni controllano se un elemento è nan
o meno e restituiscono un risultato booleano.
Ecco la soluzione usando il metodo isnan()
.
import numpy as np
import math
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not math.isnan(number) for number in myArray1]
booleanArray2 = [not math.isnan(number) for number in myArray2]
booleanArray3 = [not math.isnan(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])
Produzione:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
Rimuovere i valori nan utilizzando il metodo pandas.isnull
Di seguito è la soluzione utilizzando il metodo isnull()
da pandas
.
import numpy as np
import pandas as pd
myArray1 = np.array([1, 2, 3, np.nan, np.nan, 4, 5, 6, np.nan, 7, 8, 9, np.nan])
myArray2 = np.array([np.nan, np.nan, np.nan, np.nan, np.nan, np.nan])
myArray3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
booleanArray1 = [not pd.isnull(number) for number in myArray1]
booleanArray2 = [not pd.isnull(number) for number in myArray2]
booleanArray3 = [not pd.isnull(number) for number in myArray3]
print(myArray1)
print(myArray2)
print(myArray3)
print(myArray1[booleanArray1])
print(myArray2[booleanArray2])
print(myArray3[booleanArray3])
print(myArray1[~pd.isnull(myArray1)]) # Line 1
print(myArray2[~pd.isnull(myArray2)]) # Line 2
print(myArray3[~pd.isnull(myArray3)]) # Line 3
Produzione:
[ 1. 2. 3. nan nan 4. 5. 6. nan 7. 8. 9. nan]
[nan nan nan nan nan nan]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]
[1. 2. 3. 4. 5. 6. 7. 8. 9.]
[]
[ 1 2 3 4 5 6 7 8 9 10]