Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取布尔级数为真的索引列表_Python_Pandas_Boolean_Series_Boolean Indexing - Fatal编程技术网

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]