开发者社区> 问答> 正文

数据帧序列检测:查找连续三行为负值的组

可以说我有一列df ['test']`:

-1,-2,-3、2,-4、3,-5,-4,-3,-7

因此,我想过滤出连续至少有三个负值的组。所以

groups = my_grouping_function_by_sequence()
groups[0] = [-1,-2-3]
groups[1] = [-5,-4,-3,-7] 

在测试熊猫数字数据中的序列时是否有一些预定义的检查?它不一定是大熊猫,但我正在寻找一种快速且适应性强的解决方案。任何意见将是有益的。谢谢!

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 19:03:33 531 0
1 条回答
写回答
取消 提交回答
  • 使用GroupBycumsum创建连续的负数组。

    grps = df['test'].gt(0).cumsum()
    dfs = [d.dropna() for _, d in df.mask(df['test'].gt(0)).groupby(grps) if d.shape[0] >= 3]
    

    输出

    for df in dfs:
        print(df)
    
       test
    0  -1.0
    1  -2.0
    2  -3.0
       test
    6  -5.0
    7  -4.0
    8  -3.0
    9  -7.0
    
    • 说明

    让我们逐步进行以下操作:第一行,为连续的负数创建组

    print(grps)
    0    0
    1    0
    2    0
    3    1
    4    1
    5    2
    6    2
    7    2
    8    2
    9    2
    Name: test, dtype: int32
    

    但正如我们所看到的,它还包括正数,我们不想在输出中考虑这些正数。因此,我们使用DataFrame.mask将这些值转换为NaN:

    df.mask(df['test'].gt(0))
    # same as df.mask(df['test'] > 0)
    
       test
    0  -1.0
    1  -2.0
    2  -3.0
    3   NaN
    4  -4.0
    5   NaN
    6  -5.0
    7  -4.0
    8  -3.0
    9  -7.0
    

    然后我们在此数据帧上分组,并仅保留> =3行的组:

    for _, d in df.mask(df['test'].gt(0)).groupby(grps):
        if d.shape[0] >= 3:
            print(d.dropna())
    
       test
    0  -1.0
    1  -2.0
    2  -3.0
       test
    6  -5.0
    7  -4.0
    8  -3.0
    9  -7.0
    

    回答来源:stackoverflow

    2020-03-24 19:03:42
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载