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,有两个间隔:
谢谢。您可以这样做:
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提供的解决方案更为优雅。有什么评论吗?