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

标签 python pandas

我正在尝试识别

  • 数组中大于 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/

相关文章:

python - 如何选择 numpy 记录数组一行的列子集?

java - 远程检查文件是否存在于不同的服务器上

python - 使用 split 函数时没有足够的值来解包

Python pandas map CSV 文件

python - pivot_table 索引中的 NaN 值导致数据丢失

python - 为什么 time.sleep(...) 不受 GIL 的影响?

python - 0 keras自定义层中的训练参数

python - 如何将所有列相互相乘

python - pandas 像磁性一样合并 DataFrame

python - 如果我只考虑索引的一个级别,Pandas 基于列的聚合对多索引进行排序