126 votes

Trouver l'indice entier des lignes avec NaN dans un dataframe pandas

J'ai un DataFrame pandas comme ceci :

                    a         b
2011-01-01 00:00:00 1.883381  -0.416629
2011-01-01 01:00:00 0.149948  -1.782170
2011-01-01 02:00:00 -0.407604 0.314168
2011-01-01 03:00:00 1.452354  NaN
2011-01-01 04:00:00 -1.224869 -0.947457
2011-01-01 05:00:00 0.498326  0.070416
2011-01-01 06:00:00 0.401665  NaN
2011-01-01 07:00:00 -0.019766 0.533641
2011-01-01 08:00:00 -1.101303 -1.408561
2011-01-01 09:00:00 1.671795  -0.764629

Existe-t-il un moyen efficace de trouver l'indice "entier" des lignes contenant des NaN ? Dans ce cas, le résultat souhaité devrait être [3, 6] .

159voto

Wes McKinney Points 17545

Voici une solution plus simple :

inds = pd.isnull(df).any(1).nonzero()[0]

In [9]: df
Out[9]: 
          0         1
0  0.450319  0.062595
1 -0.673058  0.156073
2 -0.871179 -0.118575
3  0.594188       NaN
4 -1.017903 -0.484744
5  0.860375  0.239265
6 -0.640070       NaN
7 -0.535802  1.632932
8  0.876523 -0.153634
9 -0.686914  0.131185

In [10]: pd.isnull(df).any(1).nonzero()[0]
Out[10]: array([3, 6])

55voto

diliop Points 3208

Pour DataFrame df :

import numpy as np
index = df['b'].index[df['b'].apply(np.isnan)]

vous rendra le MultiIndex que vous pouvez utiliser pour indexer à nouveau dans df par exemple :

df['a'].ix[index[0]]
>>> 1.452354

Pour l'indice entier :

df_index = df.index.values.tolist()
[df_index.index(i) for i in index]
>>> [3, 6]

27voto

Vasyl Vaskivskyi Points 597

Une seule ligne de solution. Cependant, elle ne fonctionne que pour une seule colonne.

df.loc[pandas.isna(df["b"]), :].index

12voto

Filippo Mazza Points 1029

Et juste au cas où, si vous voulez trouver les coordonnées de 'nan' pour toutes les colonnes (en supposant qu'elles soient toutes numériques), voici comment procéder :

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

df
   0  1  2    3    4  5
0  0  1  3  4.0  NaN  2
1  3  5  6  NaN  3.0  3

np.where(np.asanyarray(np.isnan(df)))
(array([0, 1]), array([4, 3]))

11voto

naturesenshi Points 318

Je ne sais pas si c'est trop tard, mais vous pouvez utiliser np.where pour trouver les indices des non-valeurs comme telles :

indices = list(np.where(df['b'].isna()[0]))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X