Python 需要计算连续索引的运行次数

Python 需要计算连续索引的运行次数,python,pandas,Python,Pandas,我需要计算至少有4个连续值满足pandas中的条件的实例。下面的代码为我提供了一个Int64Index: IN: vals = chunk[chunk[col] > ninetieth].index OUT: Int64Index([427, 429, 430, 431, 436, 470, 471, 472, 473, 478, 518, 519, 520, 521, 522, 565, 566, 567, 568, 569], dtype=

我需要计算至少有4个连续值满足pandas中的条件的实例。下面的代码为我提供了一个Int64Index:

    IN: vals = chunk[chunk[col] > ninetieth].index
    OUT: Int64Index([427, 429, 430, 431, 436, 470, 471, 472, 473, 478, 518, 519, 520,
        521, 522, 565, 566, 567, 568, 569],
       dtype='int64')
我可以通过这种方式得到我想要的:

count = 0
i = 0
while i < range(len(vals)):
    try:
        if vals[i] + 3 == vals[i + 3]:
            count += 1
            i += 3
        else: i += 1
    except: break
count=0
i=0
而i
但是必须有一个更简单,更不可怕的方法,对吗


ETA:进一步澄清后,每次运行至少4个连续值时,计数应增加,直到出现间隙后再增加

一种方法是取一个范围的差值,基本上减去连续部分,然后进行分组:

v2 = vals - np.arange(len(vals))
result = (v2.to_series().groupby(v2).size() >= 4).sum()
这让我

In [141]: result
Out[141]: 3
这是因为

In [142]: v2 = vals - np.arange(len(vals))

In [143]: v2
Out[143]: 
Int64Index([427, 428, 428, 428, 432, 465, 465, 465, 465, 469, 508, 508, 508,
            508, 508, 550, 550, 550, 550, 550],
           dtype='int64')
现在,每个连续运行都有相同的编号(与我们开始时的编号不同,但这在这里并不重要)。然后:


如果不清楚的话,我的问题是,如果没有所有额外的步骤,我如何在熊猫身上实现这一点。我肯定缺少某种内置函数。你是说
而我
?这段代码看起来不起作用。这会更漂亮,但尽管出现了错误,它仍然可以工作。VAL是一个索引列表,其中条件成立,连续索引将相差1。然而,问题是“至少4”,但你正数着4。如果有五个连续的行遇到int,则可以将其计算为两个实例。@mauve:您正在将int(i)与列表或范围对象进行比较,这在Python 2中总是为True(您不应该使用,但我想您必须使用),但在Python 3中由于TypeError而失败。
In [144]: v2.to_series().groupby(v2).size()
Out[144]: 
427    1
428    3
432    1
465    4
469    1
508    5
550    5
dtype: int64

In [145]: (v2.to_series().groupby(v2).size() >= 4).sum()
Out[145]: 3