In [71]: df = DataFrame(np.arange(25).reshape(5,5))
In [72]: df
Out[72]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
Questa maschera il triangolo superiore (includere la diagonale)
In [73]: mask = np.ones(df.shape,dtype='bool')
In [74]: mask[np.triu_indices(len(df))] = False
In [75]: mask
Out[75]:
array([[False, False, False, False, False],
[ True, False, False, False, False],
[ True, True, False, False, False],
[ True, True, True, False, False],
[ True, True, True, True, False]], dtype=bool)
Simulazione della condizione (> 0,95)
In [76]: df>16
Out[76]:
0 1 2 3 4
0 False False False False False
1 False False False False False
2 False False False False False
3 False False True True True
4 True True True True True
Questa è prob la forma che si desidera che il risultato
In [77]: df[(df>16)&mask]
Out[77]:
0 1 2 3 4
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN 17 NaN NaN
4 20 21 22 23 NaN
Se si vuole veramente i valori di posizione
In [78]: x = ((df>16)&mask).values.nonzero()
In [79]: zip(x[0],x[1])
Out[79]: [(3, 2), (4, 0), (4, 1), (4, 2), (4, 3)]
Questo è interessante - Sono curioso di conoscere la risposta anche. Sono a conoscenza di numpy.diagonal(), ma sembra restituire solo i valori in diagonale, piuttosto che gli elementi al di sotto di esso .... – svenkatesh