Skip to main content
 首页 » 编程设计

python之查找 'TRUE' bool 值的最大循环

2025年05月04日14Terrylee

I need to count the largest cycle of 'TRUE' in a boolean

我有一个包含多个 TRUE 序列的 bool 系列。我希望能够确定 TRUE 值的最大循环。

例如:[0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]

我想要循环:[10,14]

我的第一种方法是逐个元素进行比较,并获取每个真值的索引。我看到的问题是我正在处理一个相当大的数据集,所以恐怕需要很长时间。

你们还有其他可行的想法吗?

谢谢:)

请您参考如下方法:

一种没有循环的可能解决方案是计算连续的 1 或 True 并获取索引最大值,最后添加 1 开头的最大值>小组:

s = pd.Series([0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]) 
print (s) 
 
a = s == 1 
b = a.cumsum() 
c = b.sub(b.mask(a).ffill().fillna(0)).astype(int) 
print (c) 
0     0 
1     0 
2     1 
3     2 
4     0 
5     0 
6     0 
7     0 
8     0 
9     0 
10    1 
11    2 
12    3 
13    4 
14    5 
dtype: int32 
 
m = c.max() 
idx = c.index[c == m] 
print (idx) 
Int64Index([14], dtype='int64') 
 
out = list(zip(idx - m + 1, idx)) 
print (out) 
[(10, 14)] 

itertools.groupby 的另一个想法 - 使用 1 为组创建列表并枚举计数器,然后获取具有最大长度的列表并获取最小和最大索引:

s = pd.Series([0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]) 
print (s) 
 
from itertools import groupby 
a = [ list(group) for key, group in groupby(enumerate(s), key= lambda x:x[1]) if key] 
print (a) 
[[(2, 1), (3, 1)], [(10, 1), (11, 1), (12, 1), (13, 1), (14, 1)]] 
 
L=[x[0] for x in max(a, key=len)] 
out = [min(L), max(L)] 
print (out) 
[10, 14]