Python 需要计算连续索引的运行次数
我需要计算至少有4个连续值满足pandas中的条件的实例。下面的代码为我提供了一个Int64Index: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=
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