在序列为0和1的列中过滤行方式模式

时间:2014-10-22 15:23:13

标签: python pandas

我正在寻找一种方法来过滤/搜索数据框中行中的seqeuences / patterns,如下所示:

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

我现在需要在哪个时间范围内传感器(A,B,C,..)处于活动状态(值== 1)。例如。对于传感器C,有两个间隔:

  1. 开始时间:2011-11-02 19:29:30,结束时间:2011-11-02 19:30:46
  2. 开始时间:2011-11-02 19:31:25,结束时间:2011-11-02 19:31:41
  3. 所以: 0 - > 1:startdate和 1 - > 0:结束

    我的第一个解决方案是迭代行。但由于真正的数据集非常大,我想知道是否有任何方法可以用熊猫来完成。

    感谢。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

col = df['A']
scol = col.shift()
starts = col & ~(scol == 1)
ends = ~(col == 1) & scol
if col[len(col)-1]:
    ends[len(ends)-1] = True

然后startsends将是两个布尔系列,标记列中的所有开始日期和结束日期' A'。

最后两行用于创建结束日期,如果列结束为... 1 1,则会丢失这些结束日期。此外,如果该列以1 1 ...开头(如问题'中所述的DSM),则会创建开始日期。

答案 1 :(得分:1)

res = {}
t = df - df.shift(1)
for col in df.columns:
    res[col] = t[col][t[col] != 0]

当特定列的值为1时,表示时间范围已开始,当它为-1时,表示已结束

另外,你可以使用dict理解:

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