2016-12-14 5 views
3

Ich habe einen sehr großen Datensatz (etwa 200000x400), aber ich habe es gefiltert und nur ein paar hundert Werte bleiben, der Rest sind NaN. Ich möchte eine Liste der Indizes dieser verbleibenden Werte erstellen. Ich kann keine einfache Lösung finden.Finden Sie Indizes von Nicht-NaN-Werten in Pandas DataFrame

0  1  2 
0 NaN NaN 1.2 
1 NaN NaN NaN 
2 NaN 1.1 NaN 
3 NaN NaN NaN 
4 1.4 NaN 1.01 

Zum Beispiel würde Ich mag eine Liste von [(0,2), (2,1), (4,0), (4,2)].

+0

Bitte wählen [Nickil Maveli Antwort] (http://stackoverflow.com/a/41150427/5741205) als richtige - es ist viel schneller und idiomatische – MaxU

Antwort

2

Konvertieren Sie den Datenrahmen zu seinem Äquivalent NumPy Array-Darstellung und überprüfen Sie für NaNs vorhanden. Später, nehmen Sie die Negation seiner entsprechenden Indizes (die nicht Nullen anzeigt) mit numpy.argwhere. Da die benötigte Ausgabe eine Liste von Tupeln sein muss, könnten Sie dann die Funktion map des Generators tuple als Funktion für jedes iterierbare Array verwenden.

>>> list(map(tuple, np.argwhere(~np.isnan(df.values)))) 
[(0, 2), (2, 1), (4, 0), (4, 2)] 
1

davon aus, dass Ihre Spaltennamen sind von int dtype:

In [73]: df 
Out[73]: 
    0 1  2 
0 NaN NaN 1.20 
1 NaN NaN NaN 
2 NaN 1.1 NaN 
3 NaN NaN NaN 
4 1.4 NaN 1.01 

In [74]: df.columns.dtype 
Out[74]: dtype('int64') 

In [75]: df.stack().reset_index().drop(0, 1).apply(tuple, axis=1).tolist() 
Out[75]: [(0, 2), (2, 1), (4, 0), (4, 2)] 

wenn Ihre Spaltennamen sind von object dtype:

In [81]: df.columns.dtype 
Out[81]: dtype('O') 

In [83]: df.stack().reset_index().astype(int).drop(0,1).apply(tuple, axis=1).tolist() 
Out[83]: [(0, 2), (2, 1), (4, 0), (4, 2)] 

-Timing für 50K Reihen DF:

In [89]: df = pd.concat([df] * 10**4, ignore_index=True) 

In [90]: df.shape 
Out[90]: (50000, 3) 

In [91]: %timeit list(map(tuple, np.argwhere(~np.isnan(df.values)))) 
10 loops, best of 3: 144 ms per loop 

In [92]: %timeit df.stack().reset_index().drop(0, 1).apply(tuple, axis=1).tolist() 
1 loop, best of 3: 1.67 s per loop 

Fazit: die Nickil Maveli's solution ist 12-mal schneller für diesen Test DF

Verwandte Themen