2015-11-10 35 views
5

Cerco di recuperare per ogni riga contenente i valori NaN tutti gli indici delle colonne corrispondenti.Recupera indici di valori NaN in un dataframe panda

d=[[11.4,1.3,2.0, NaN],[11.4,1.3,NaN, NaN],[11.4,1.3,2.8, 0.7],[NaN,NaN,2.8, 0.7]] 
df = pd.DataFrame(data=d, columns=['A','B','C','D']) 
print df 

     A B C D 
0 11.4 1.3 2.0 NaN 
1 11.4 1.3 NaN NaN 
2 11.4 1.3 2.8 0.7 
3 NaN NaN 2.8 0.7 

ho già fatto seguente:

  • aggiungere una colonna con il conteggio di NaN per ogni riga
  • ottenere gli indici di ciascuna riga contenente NaN valori

Quello che voglio (idealmente il nome della colonna) è ottenere una lista come questa:

[ ['D'],['C','D'],['A','B'] ] 

spero di poter trovare un modo senza fare per ogni riga del test per ogni colonna

if df.ix[i][column] == NaN: 

Sto cercando un modo panda per essere in grado di affrontare la mia enorme insieme di dati.

Grazie in anticipo.

+0

Ho già trovato gli indici di ogni riga contenente NaN v alori. Quello che voglio sono gli indici delle colonne per ogni riga. Scusa se la descrizione non è chiara. – dooms

risposta

2

Un altro modo, estrarre i file che sono NaN:

In [11]: df_null = df.isnull().unstack() 

In [12]: t = df_null[df_null] 

In [13]: t 
Out[13]: 
A 3 True 
B 3 True 
C 1 True 
D 0 True 
    1 True 
dtype: bool 

In questo modo si ottiene la maggior parte della strada e può essere sufficiente.
Anche se può essere più facile lavorare con la serie:

In [14]: s = pd.Series(t2.index.get_level_values(1), t2.index.get_level_values(0)) 

In [15]: s 
Out[15]: 
0 D 
1 C 
1 D 
3 A 
3 B 
dtype: object 

esempio se si voleva le liste (anche se non credo che li avrebbe bisogno)

In [16]: s.groupby(level=0).apply(list) 
Out[16]: 
0  [D] 
1 [C, D] 
3 [A, B] 
dtype: object 
+0

questo è chiaramente il modo più "pandorable", ma 100 volte più lento di @maxymoo – dooms

+0

@dooms cosa si intende fare la applicano? –

+0

@dooms su un grande insieme di dati le prime dovrebbe essere abbastanza veloce .. –

3

Dovrebbe essere efficace utilizzare uno SciPy coordinate formato matrice sparsa per recuperare le coordinate dei valori nulli:

import scipy.sparse as sp 

x,y = sp.coo_matrix(df.isnull()).nonzero() 
print(list(zip(x,y))) 

[(0, 3), (1, 2), (1, 3), (3, 0), (3, 1)] 

noti che sto chiamando il metodo nonzero per produrre appena le coordinate di le voci diverse da zero nella matrice sparse sottostante poiché non mi interessa i valori effettivi che sono tutti True.

+0

questa soluzione è 2 volte più veloce (rispetto a quella di Alexander) ma non so come navigare in questo tipo di dati. non è facile come una soluzione impressionante – dooms

+0

, grazie! –

1

È possibile scorrere tutte le righe del dataframe, creare una maschera di valori nulli e generare l'indice (cioè le colonne nel dataframe).

lst = [] 
for _, row in df.iterrows(): 
    mask = row.isnull() 
    lst += [row[mask].index.tolist()] 

>>> lst 
[['D'], ['C', 'D'], [], ['A', 'B']] 
0

un altro modo più semplice è:

>>>df.isnull().any(axis=1) 
0  True 
1  True 
2 False 
3  True 
dtype: bool 

al sottoinsieme:

>>> bool_idx = df.isnull().any(axis=1) 
>>> df[bool_idx] 
    A   B  C D 
0 11.4 1.3  2.0 NaN 
1 11.4 1.3  NaN NaN 
3 NaN  NaN 2.8 0.7 

per ottenere indice intero :

>>> df[bool_idx].index 
Int64Index([0, 1, 3], dtype='int64') 
Problemi correlati