`Pandas argmax` 在屏蔽后获取所有 `True` 索引 (Python 3)(例如 (pd.Series > 0).argmax()))

`Pandas argmax` to get all `True` indices after masking (Python 3) (e.g. (pd.Series > 0).argmax()))

我想做什么,但 argmax 只给我第一个值 True:

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 来做到这一点?如果这不能用 argmax 完成,我可以用 pandas 中的不同功能来完成吗?

您可以使用 compress:

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

结果输出:

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

在最新的pandas版本中,可以直接将过滤函数传给[].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')