我正在尝试识别
数组中大于 5 的前 6 个元素,
然后是接下来的 6 个小于 5 的连续元素。
这两个跨度之间的元素数量是我想要的 输出。
我过去做过类似的问题,我需要找到连续值的最长长度 >n
并使用np.where
将我的系列转换为二进制数组,然后找到最大连续值。
我尝试使用类似的方法,但效果不是很好,尽管我坚持使用二进制数组,因为我认为这将是处理事情的最简单的方法。 df
是我的数组,n
是数组的长度。
def first_six_dupes(df, n):
for i in (5, n-1):
if df[i-5] == 1 and df[i-4] == 1 and df[i-3] == 1 and df[i-2] == 1 and df[i-1] == 1 and df[i] == 1:
return i
当我打印输出时,这会返回“None
”。如果我要求它只查找等于 1(index==1
) 的单个索引,它会返回最后一个索引,而不是第一次出现的索引。我没有收到任何错误。
我的预期结果将是二进制数组中前六个连续“1
”数字的最后一个索引。例如,如果我的数组是 [0,0,1,0,1,1,1,1,1,1,0,0,0,1,0]
我希望获取 9
作为返回值。
最佳答案
MCVE
df = pd.DataFrame({'col1': [6,7,8,9,9,9,2,2,1,1,6,2,2,2,2,2,3]})
<小时/>
IIUC,您可以按连续值分组并使用 cumsum 来查找符合您条件的连续值范围之间的这些区域。
def elements_between_runs(series, threshold, runs):
m = series.gt(threshold)
g = m.ne(m.shift()).cumsum()
f = m.groupby(g).cumsum().eq(runs).idxmax()
l = (~m).groupby(g).cumsum().eq(runs).idxmax()
if l > f:
return l - f - runs
else:
raise ValueError('No region found matching criteria')
<小时/>
>>> elements_between_runs(df.col1, threshold=5, runs=6)
5
>>> elements_between_runs(df.col1, threshold=5, runs=7)
ValueError: No region found matching criteria
关于python - 有没有一种有效的方法来查找系列中的前 n 个重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56226663/