需要计算连续索引的运行

时间:2018-09-12 16:59:55

标签: python pandas

我需要计算至少有4个连续值满足熊猫标准的实例。下面的代码为我提供了一个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

但是有一种更简单,更不可怕的方法吧?

ETA:进一步澄清后,每次运行至少要有4个连续值,计数应该增加,直到出现间隔才重新计数。

1 个答案:

答案 0 :(得分:1)

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

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')

现在,每个连续运行都具有相同的编号(与我们开始时的编号不同,但是在这里无关紧要)。然后:

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