2014-04-13 20 views

回答

5

另一種方法是使用stack

>>> s = df.stack() 
>>> s[s].index.tolist() 
[(0L, 'a'), (1L, 'a'), (1L, 'b'), (2L, 'b'), (2L, 'c')] 

這工作,因爲這裏stack返回扁平版本:

>>> df.stack() 
0 a  True 
    b False 
    c False 
1 a  True 
    b  True 
    c False 
2 a False 
    b  True 
    c  True 
dtype: object 
+0

太棒了! – unutbu

+0

總是看起來如此簡單:) – user3139545

+0

甚至可以在一行'df [df] .stack()。index.tolist()'中做到這一點。儘管'df [df]'比's'慢得多。 –

3
In [27]: df 
Out[27]: 
     a  b  c 
1 True False False 
2 True True False 
3 False True True 

[3 rows x 3 columns] 

您可以找到與True個S使用np.where

In [28]: np.where(df) 
Out[28]: (array([0, 1, 1, 2, 2]), array([0, 0, 1, 1, 2])) 

In [29]: x, y = np.where(df) 

索引和列ndarrays,您可以選擇使用NumPy的整數索引標籤:

In [30]: df.index[y] 
Out[30]: Int64Index([1, 1, 2, 2, 3], dtype='int64') 

In [31]: df.columns[x] 
Out[31]: Index([u'a', u'b', u'b', u'c', u'c'], dtype='object') 

zip放在一起:

In [32]: zip(df.index[y], df.columns[x]) 
Out[32]: [(1, 'a'), (1, 'b'), (2, 'b'), (2, 'c'), (3, 'c')]