2016-11-11 18 views
1

Что я хочу делать, но argmax дает мне первое значение, которое True:`Pandas argmax`, чтобы получить все индексы` True` после маскировки (Python 3) (например, (pd.Series> 0) .argmax()))

Se = pd.Series(np.arange(6), index=list("abcdef")) 
#a 0 
#b 1 
#c 2 
#d 3 
#e 4 
#f 5 
#dtype: int64 

mask = (Se % 2 == 0) 
#a  True 
#b False 
#c  True 
#d False 
#e  True 
#f False 
#dtype: bool 

mask.argmax() 
#'a' 

Что я должен делать вместо этого:

Se[mask].index 
# Index(['a', 'c', 'e'], dtype='object') 

Это не слишком неудобно, но я должен создать экземпляр Series первым, который уменьшает мою производительность. Было бы хорошо, чтобы быть в состоянии сделать это:

(pd.Series(np.arange(6), index=list("abcdef")) % 2 == 0).argmax() 

Мой вопрос: Как я могу это сделать с помощью argmax? Если этого не может быть сделано w/argmax, могу ли я сделать это с другой функцией в pandas?

+2

Это то, что вы хотите: 'Se.index [(Se% 2 == 0)]' или вам нужно сделать это «цепным» способом? – MaxU

ответ

2

Вы можете использовать compress:

idx = pd.Series(np.arange(6), index=list("abcdef")).compress(lambda x: x % 2 == 0).index 

Полученный выход:

Index(['a', 'c', 'e'], dtype='object') 
0

В последней версии панд, вы можете напрямую передать функцию фильтра [] или .loc[]:

Se[lambda x: x%2 == 0].index # or Se.loc[lambda x: x%2 == 0].index 
# Index([u'a', u'c', u'e'], dtype='object')