我需要计算至少有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个连续值,计数应该增加,直到出现间隔才重新计数。
答案 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