web-dev-qa-db-fra.com

Supprimer des valeurs nan d'un tableau

Je veux comprendre comment supprimer des valeurs nan de mon tableau. Cela ressemble à quelque chose comme ça: 

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration

Je suis relativement nouveau en python, donc j'apprends toujours. Des conseils?

148
Dax Feliz

Si vous utilisez numpy pour vos tableaux, vous pouvez également utiliser

x = x[numpy.logical_not(numpy.isnan(x))]

De manière équivalente 

x = x[~numpy.isnan(x)]

[Merci à chbrown pour le raccourci ajouté] 

Explication

La fonction interne, numpy.isnan, renvoie un tableau booléen/logique qui a la valeur True partout où x n'est pas un nombre. Comme nous voulons le contraire, nous utilisons l’opérateur non-logique, ~, pour obtenir un tableau avec Trues partout où x est un nombre valide.

Enfin, nous utilisons ce tableau logique pour indexer dans le tableau d'origine x, pour récupérer uniquement les valeurs non-NaN.

261
jmetz
filter(lambda v: v==v, x)

fonctionne à la fois pour les listes et le tableau numpy puisque v! = v uniquement pour NaN

39
udibr

Essaye ça:

import math
print [value for value in x if not math.isnan(value)]

Pour plus d'informations, consultez la section List Comprehensions .

32
liori

Pour moi, la réponse de @jmetz n'a pas fonctionné, mais utiliser pandas isnull () a fonctionné.

x = x[~pd.isnull(x)]
12
Daniel Kislyuk

Faire ce qui précède:

x = x[~numpy.isnan(x)]

ou

x = x[numpy.logical_not(numpy.isnan(x))]

J'ai trouvé que la réinitialisation à la même variable (x) ne supprimait pas les valeurs nan réelles et devait utiliser une variable différente. Le paramétrer sur une variable différente supprime le nans . 

y = x[~numpy.isnan(x)]
6
melissaOu

Comme montré par d'autres 

x[~numpy.isnan(x)]

travaux. Mais cela produira une erreur si le type numpy n’est pas un type de données natif, par exemple s’il s’agit d’un objet. Dans ce cas, vous pouvez utiliser des pandas.

x[~pandas.isnan(x)]
2
koliyat9811

Si vous utilisez numpy 

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]
1
aloha

Le réponse acceptée change de forme pour les tableaux 2D. Je présente une solution ici, en utilisant la fonctionnalité Pandas dropna () . Cela fonctionne pour les tableaux 1D et 2D. Dans le cas 2D, vous pouvez choisir la météo vers déposez la ligne ou la colonne contenant np.nan.

import pandas as pd
import numpy as np

def dropna(arr, *args, **kwarg):
    assert isinstance(arr, np.ndarray)
    dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
    if arr.ndim==1:
        dropped=dropped.flatten()
    return dropped

x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )


print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')

print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')

print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')

Résultat:

==================== 1D Case: ====================
Input:
[1400. 1500. 1600.   nan   nan   nan 1700.]

dropna:
[1400. 1500. 1600. 1700.]


==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna (rows):
[[1400. 1500. 1600.]]

dropna (columns):
[[1500.]
 [   0.]
 [1800.]]


==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna:
[1400. 1500. 1600. 1700.]
0
Markus Dutschke

C’est mon approche pour filtrer ndarray "X" pour NaNs et infs, 

Je crée une mappe de lignes sans aucune variable NaN ni aucune variable inf comme suit:

idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))

idx est un tuple. Sa deuxième colonne (idx[1]) contient les index du tableau, où ni NaN ni inf n’ont été trouvés dans la ligne.

Ensuite:

filtered_X = X[idx[1]]

filtered_X contient X sans NaN ni inf.

0
aerijman