我正在尝试确定
数组的前6个元素大于5 ,
,然后是小于5的后6个连续元素。
这两个跨度之间的元素数量是我想要的 输出。
过去,我遇到了类似的问题,我需要找到最长长度的连续值 >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
作为返回值。
答案 0 :(得分:1)
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
答案 1 :(得分:0)
这将创建一个名为“ check”的新列,如果该列大于5,则该值为1,如果其<= 5,则该值为0。
df['check'] = np.where(df['col'] > 5, 1,0)
这将创建另一个名为“重复”的新列,您可以在其中看到连续多少次为<=或> 5。
df['repeat'] = df['check'].groupby((df['check'] != df['check'].shift()).cumsum()).transform('count')
最后,我们可以进行筛选以找到大于6的组。您也可以通过“检查”进行筛选,以仅获取小于或大于5的组。
df[df.groupby('repeat')['repeat'].transform('size')>=6]