有没有一种有效的方法来查找序列中的前n个重复项?

时间:2019-05-20 18:57:02

标签: python pandas

我正在尝试确定

  • 数组的前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作为返回值。

2 个答案:

答案 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]