Eliminar valores nan de un array NumPy

Vaibhav Vaibhav 30 enero 2023
  1. Eliminar valores nan usando los métodos logical_not() e isnan() en NumPy
  2. Eliminar valores de Nan usando el método isfinite() en NumPy
  3. Eliminar valores de Nan utilizando el método math.isnan
  4. Eliminar valores nan utilizando el método pandas.isnull
Eliminar valores nan de un array NumPy

Este artículo discutirá algunas funciones integradas de NumPy que puede utilizar para eliminar valores nan.

Eliminar valores nan usando los métodos logical_not() e isnan() en NumPy

logical_not() se utiliza para aplicar un NOT lógico a los elementos de un array. isnan() es una función booleana que comprueba si un elemento es nan o no.

Usando la función isnan(), podemos crear un array booleana que tenga False para todos los valores que no sean nan y True para todos los valores nan. A continuación, usando la función logical_not(), podemos convertir True a False y viceversa.

Por último, utilizando la indexación booleana, podemos filtrar todos los valores no nan del array NumPy original. Todos los índices con True como valor se utilizarán para filtrar el array NumPy.

Para obtener más información sobre estas funciones en profundidad, consulte su documentación oficial y aquí, respectivamente.

Consulte el siguiente fragmento de código para conocer la solución.

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)

Producción :

[ 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 es una versión simplificada de Line 1.

Eliminar valores de Nan usando el método isfinite() en NumPy

Como sugiere el nombre, la función isfinite() es una función booleana que comprueba si un elemento es finito o no. También puede buscar valores finitos en un array y devuelve un array booleana para el mismo. el array booleana almacenará False para todos los valores nan y True para todos los valores finitos.

Usaremos esta función para recuperar un array booleana para el array de destino. Usando la indexación booleana, filtraremos todos los valores finitos. Nuevamente, como se mencionó anteriormente, los índices con valores True se utilizarán para filtrar el array.

Aquí está el código de ejemplo.

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)

Producción :

[ 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 obtener más información sobre esta función, consulte la documentación oficial

Eliminar valores de Nan utilizando el método math.isnan

Aparte de estas dos soluciones NumPy, hay dos formas más de eliminar los valores nan. Estas dos formas involucran la función isnan() de la biblioteca math y la función isnull de la biblioteca pandas. Ambas funciones comprueban si un elemento es nan o no y devuelven un resultado booleano.

Aquí está la solución usando el 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])

Producción :

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

Eliminar valores nan utilizando el método pandas.isnull

A continuación se muestra la solución utilizando el 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

Producción :

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