查找“ TRUE”布尔值的最大周期

aro*_*jas 1 python pandas

我需要计算布尔值中“ TRUE”的最大周期

我有一个带有几个TRUE序列的布尔系列。我希望能够确定TRUE值的最大周期。

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

我想要一个周期: [10,14]

我的第一种方法是逐个元素比较并获取每个真实值的索引。我看到的问题是我正在处理相当大的数据集,因此恐怕会花费很长时间。

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

谢谢 :)

jez*_*ael 6

没有循环的一个可能的解决方案是连续计数1TrueS和获得指标最大值,为最后启动加最大值1S基团:

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)]
Run Code Online (Sandbox Code Playgroud)

的另一种想法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]
Run Code Online (Sandbox Code Playgroud)