Remover valores Nan de uma NumPy Array

Vaibhav Vaibhav 30 janeiro 2023
  1. Remova os valores Nan usando os métodos logical_not() e isnan() em NumPy
  2. Remova os valores Nan usando o método isfinite() no NumPy
  3. Remova os valores Nan usando o método math.isnan
  4. Remova os valores Nan usando o método pandas.isnull
Remover valores Nan de uma NumPy Array

Este artigo discutirá algumas funções NumPy embutidas que você pode usar para excluir valores nan.

Remova os valores Nan usando os métodos logical_not() e isnan() em NumPy

logical_not() é usado para aplicar NOT lógico aos elementos de um array. isnan() é uma função booleana que verifica se um elemento é nan ou não.

Usando a função isnan(), podemos criar um array booleano que tem False para todos os valores não nan e True para todos os valores nan. A seguir, usando a função logical_not(), podemos converter True em False e vice-versa.

Por último, usando a indexação booleana, podemos filtrar todos os valores não nan do array NumPy original. Todos os índices com True como valor serão usados ​​para filtrar o array NumPy.

Para aprender mais sobre essas funções em detalhes, consulte a documentação oficial e aqui, respectivamente.

Consulte o seguinte fragmento de código para a solução.

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)

Resultado:

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

Line 2 é uma versão simplificada da Line 1.

Remova os valores Nan usando o método isfinite() no NumPy

Como o nome sugere, a função isfinite() é uma função booleana que verifica se um elemento é finito ou não. Ele também pode verificar se há valores finitos em um array e retorna um array booleana para o mesmo. O array booleano armazenará False para todos os valores nan e True para todos os valores finitos.

Usaremos esta função para recuperar um array booleano para o array de destino. Usando a indexação booleana, filtraremos todos os valores finitos. Novamente, como mencionado acima, os índices com valores True serão usados ​​para filtrar o array.

Aqui está o código de exemplo.

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)

Resultado:

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

Para saber mais sobre esta função, consulte a documentação oficial

Remova os valores Nan usando o método math.isnan

Além dessas duas soluções NumPy, existem mais duas maneiras de remover valores nan. Estas duas formas envolvem a função isnan() da biblioteca math e a função isnull da biblioteca pandas. Ambas as funções verificam se um elemento é nan ou não e retornam um resultado booleano.

Aqui está a solução usando o método 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])

Resultado:

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

Remova os valores Nan usando o método pandas.isnull

Abaixo está a solução usando o método isnull() de 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

Resultado:

[ 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]
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.