2014-08-27 3 views
9

j'ai un dataframe df ce qui suit:pandas géants dataframe sélectionner les index nan

In [10]: df.index.unique() 
Out[10]: array([u'DC', nan, u'BS', u'AB', u'OA'], dtype=object) 

Je peux facilement sélectionner des df.ix [ "DC"], df.ix [ "BS"], etc. Mais j'ai du mal à sélectionner les index nan.

df.ix[nan], df.ix["nan"], df.ix[np.nan] all won't work. 

Comment puis-je sélectionner les lignes avec nan comme l'indice?

+1

en général il est fortement déconseillé d'utiliser nan dans un index - si vous avez plus de 1 nan votre index n'est pas unique et donc beaucoup d'ops sont beaucoup moins efficaces et compliqués – Jeff

Répondre

12

Une façon serait d'utiliser df.index.isnull() pour identifier l'emplacement du NaN:

In [218]: df = pd.DataFrame({'Date': [0, 1, 2, 0, 1, 2], 'Name': ['A', 'B', 'C', 'A', 'B', 'C'], 'val': [0, 1, 2, 3, 4, 5]}, index=['DC', np.nan, 'BS', 'AB', 'OA', np.nan]); df 
Out[218]: 
    Date Name val 
DC  0 A 0 
NaN  1 B 1 
BS  2 C 2 
AB  0 A 3 
OA  1 B 4 
NaN  2 C 5 

In [219]: df.index.isnull() 
Out[219]: array([False, True, False, False, False, True], dtype=bool) 

Ensuite, vous pouvez sélectionner ces lignes à l'aide df.loc:

In [220]: df.loc[df.index.isnull()] 
Out[220]: 
    Date Name val 
NaN  1 B 1 
NaN  2 C 5 

Note: Ma réponse originale utilisé pd.isnull(df.index) au lieu de Zero's suggestion, df.index.isnull(). Il est préférable d'utiliser df.index.isnull() car pour les types d'index qui ne peuvent pas contenir de NaN, tels que Int64Index et RangeIndex, la méthode isnullreturns an array of all False values immediately au lieu de vérifier sans réfléchir chaque élément de l'index pour les valeurs NaN.

+0

Aussi, 'df.loc [df.index La méthode .isnull()] - 'isnull' est ajoutée. – Zero

+0

@Zero: Merci pour l'amélioration! – unutbu

+0

Si nous devons supprimer les lignes d'index 'nan', alors' df.loc [df.index.notnull()] 'aide !! –

Questions connexes