Python 获取布尔级数为真的索引列表
我有一个带有布尔项的熊猫系列。我想得到一个索引列表,其中的值是Python 获取布尔级数为真的索引列表,python,pandas,boolean,series,boolean-indexing,Python,Pandas,Boolean,Series,Boolean Indexing,我有一个带有布尔项的熊猫系列。我想得到一个索引列表,其中的值是True 例如,输入pd.Series([True,False,True,True,False,False,False,True]) 应产生输出[0,2,3,7] 我可以通过列表理解来完成,但是有更干净或更快的吗?使用 如果需要np.array对象,请获取.values >>> s[s].index.values array([0, 2, 3, 7]) 使用 使用 使用 使用 使用 使用python内置
True
例如,输入pd.Series([True,False,True,True,False,False,False,True])
应产生输出[0,2,3,7]
我可以通过列表理解来完成,但是有更干净或更快的吗?使用
如果需要np.array
对象,请获取.values
>>> s[s].index.values
array([0, 2, 3, 7])
使用
使用
使用
使用
使用
使用python内置的
使用
列表理解
除此之外,以下是以下设置的相应时间(从最快到最慢)
将numpy导入为np
作为pd进口熊猫
s=pd.系列([x>0.5表示np.随机.随机(尺寸=1000)])
使用
>>timeit np.where(s)[0]
每个回路12.7µs±77.4 ns(7次运行的平均值±标准偏差,每个100000个回路)
使用
>>timeit np.flatnonzero(s)
每个回路18µs±508 ns(7次运行的平均值±标准偏差,每个100000个回路)
使用 布尔索引的时间差真的让我感到惊讶,因为布尔索引通常使用得更多
>>timeit s.index[s]
每个回路82.2µs±38.9 ns(7次运行的平均值±标准偏差,每个10000个回路)
使用
>timeit[s]。索引
每个回路1.75 ms±2.16µs(7次运行的平均值±标准偏差,每个1000个回路)
如果需要np.array
对象,请获取.values
>>> s[s].index.values
array([0, 2, 3, 7])
>timeit s[s].index.values
每个回路1.76 ms±3.1µs(7次运行的平均值±标准偏差,每个1000个回路)
如果需要更易于阅读的版本>>timeit[s==True]。索引
每个回路1.89 ms±3.52µs(7次运行的平均值±标准偏差,每个1000个回路)
使用>>timeit s.where(s).dropna()索引 每个回路2.22 ms±3.32µs(7次运行的平均值±标准偏差,每个100个回路) >>>timeit s.where(s==True).dropna().index 每个回路2.37 ms±2.19µs(7次运行的平均值±标准偏差,每个100个回路)
使用>>timeit s.mask.dropna().index 每个回路2.29 ms±1.43µs(7次运行的平均值±标准偏差,每个100个回路) >>>timeit s.mask(s==True).dropna().index 每个回路2.44 ms±5.82µs(7次运行的平均值±标准偏差,每个100个回路)
使用
列表理解
>>如果s[i]]
每个回路13.7 ms±40.5µs(7次运行的平均值±标准偏差,每个100个回路)
使用python内置的
>>timeit[*过滤器(s.get,s.index)]
每个回路14.2 ms±28.4µs(7次运行的平均值±标准偏差,每个100个回路)
使用>>timeit np.非零 ValueError:传递值的长度为1,索引表示1000。
使用>>timeit np.argwhere(s.ravel() ValueError:传递值的长度为1,索引表示1000。
如果序列索引具有label而不是index range怎么办?@pyd,那么您可以使用答案中提到的选项
Boolean index
,pd.series.index
<代码>过滤器和列表理解
-基本上不是numpyones@Dahn我不明白你的回答。你能进一步解释一下吗?@MattS如果该系列的索引不是范围索引,那么rafaelc
的答案中列出的基于numpy的任何方法都不会起作用,因为numpy在转换时会忘记索引。因此,我列出了在这种情况下仍然有效的方法。这对您有用吗?使用列表理解的上一个版本在if子句中只有一个小的输入错误:如果s[i]而不是s[i],更好的测试用例是s=pd.Series([True,False,True,True,False,False,True],index=list('ABCDEFGH'))
。预期输出:索引(['A','C','D','H'],…)
。由于某些解决方案(尤其是所有np函数)会删除索引并使用自动编号索引……如果我们有一个命名索引,通常不希望删除它。
>>> np.nonzero(s)
(array([0, 2, 3, 7]),)
>>> np.flatnonzero(s)
array([0, 2, 3, 7])
>>> np.where(s)[0]
array([0, 2, 3, 7])
>>> np.argwhere(s).ravel()
array([0, 2, 3, 7])
>>> s.index[s]
array([0, 2, 3, 7])
>>> [*filter(s.get, s.index)]
[0, 2, 3, 7]
>>> [i for i in s.index if s[i]]
[0, 2, 3, 7]