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]
