我需要计算布尔值中“ TRUE”的最大周期
我有一个带有几个TRUE序列的布尔系列。我希望能够确定TRUE值的最大周期。
例如: [0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]
我想要一个周期: [10,14]
我的第一种方法是逐个元素比较并获取每个真实值的索引。我看到的问题是我正在处理相当大的数据集,因此恐怕会花费很长时间。
你们还有其他可行的想法吗?
谢谢 :)
没有循环的一个可能的解决方案是连续计数1或TrueS和获得指标最大值,为最后启动加最大值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)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |