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?
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 True
s 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.
filter(lambda v: v==v, x)
fonctionne à la fois pour les listes et le tableau numpy puisque v! = v uniquement pour NaN
Essaye ça:
import math
print [value for value in x if not math.isnan(value)]
Pour plus d'informations, consultez la section List Comprehensions .
Pour moi, la réponse de @jmetz n'a pas fonctionné, mais utiliser pandas isnull () a fonctionné.
x = x[~pd.isnull(x)]
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)]
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)]
Si vous utilisez numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
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.]
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
.