Python 筛选序列为0和1的列中的行模式

Python 筛选序列为0和1的列中的行模式,python,pandas,Python,Pandas,我正在寻找一种在数据框中过滤/搜索行中的序列/模式的方法,如下所示: sensor A B C D E F date 2011-11-02 19:22:32 0 0 0 0 1 0 2011-11-02 19:29:18 0 0 0 0 1 0 2011-11-02 19:29:30 0 0 1 0 1 0 2011-11-02 19:29:34 0 0 1 1 1 0 2011-11-02 19:29:35

我正在寻找一种在数据框中过滤/搜索行中的序列/模式的方法,如下所示:

sensor               A  B  C  D  E  F
date
2011-11-02 19:22:32  0  0  0  0  1  0
2011-11-02 19:29:18  0  0  0  0  1  0
2011-11-02 19:29:30  0  0  1  0  1  0
2011-11-02 19:29:34  0  0  1  1  1  0
2011-11-02 19:29:35  0  0  1  1  0  0
2011-11-02 19:30:06  0  0  1  0  0  0
2011-11-02 19:30:10  0  0  1  0  1  0
2011-11-02 19:30:46  0  0  0  0  1  0
2011-11-02 19:31:25  0  0  1  0  1  0
2011-11-02 19:31:26  0  0  1  0  0  0
2011-11-02 19:31:31  0  0  1  1  0  0
2011-11-02 19:31:41  0  0  0  1  0  0
col = df['A']
scol = col.shift()
starts = col & ~(scol == 1)
ends = ~(col == 1) & scol
if col[len(col)-1]:
    ends[len(ends)-1] = True
我现在需要知道传感器(A,B,C,…)在哪个时间段是活动的(值==1)。例如,对于传感器C,有两个间隔:

  • 开始时间:2011-11-0219:29:30,结束时间:2011-11-0219:30:46
  • 开始时间:2011-11-0219:31:25结束时间:2011-11-0219:31:41
  • 因此: 0->1:开始日期和结束日期 1->0:结束日期

    我的第一个解决方案是对行进行迭代。但由于真实的数据集相当大,我想知道是否有任何方法可以用熊猫做到这一点


    谢谢。

    您可以这样做:

    sensor               A  B  C  D  E  F
    date
    2011-11-02 19:22:32  0  0  0  0  1  0
    2011-11-02 19:29:18  0  0  0  0  1  0
    2011-11-02 19:29:30  0  0  1  0  1  0
    2011-11-02 19:29:34  0  0  1  1  1  0
    2011-11-02 19:29:35  0  0  1  1  0  0
    2011-11-02 19:30:06  0  0  1  0  0  0
    2011-11-02 19:30:10  0  0  1  0  1  0
    2011-11-02 19:30:46  0  0  0  0  1  0
    2011-11-02 19:31:25  0  0  1  0  1  0
    2011-11-02 19:31:26  0  0  1  0  0  0
    2011-11-02 19:31:31  0  0  1  1  0  0
    2011-11-02 19:31:41  0  0  0  1  0  0
    
    col = df['A']
    scol = col.shift()
    starts = col & ~(scol == 1)
    ends = ~(col == 1) & scol
    if col[len(col)-1]:
        ends[len(ends)-1] = True
    
    然后,
    开始
    结束
    将是两个布尔序列,标记列“A”中的所有开始日期和结束日期

    最后两行用于创建结束日期,如果列以
    结尾,则该日期将丢失。。。1 1
    。此外,如果列以
    11…
    开头(如问题注释中DSM所述),则将创建开始日期

    res = {}
    t = df - df.shift(1)
    for col in df.columns:
        res[col] = t[col][t[col] != 0]
    
    当特定列的值为1时,表示时间范围已开始;当值为-1时,表示时间范围已结束

    此外,您可以使用听写理解:

    res = {col: t[col][t[col] != 0] for col in df.columns}
    

    你说你想要传感器处于活动状态的时间段,但是你说
    0->1
    定义了起始日期。E的第一排呢?即使没有0->1转换,这是否开始了一个时间段,或者是唯一的时间段19:30:10-19:31:26?以1开头(或以1结尾)的列可以被视为从那里开始/结束。谢谢你迄今为止的回答。这两种解决方案都很有效,速度也很快,但我认为@acushner提供的解决方案更为优雅。有什么评论吗?