我正在寻找一种方法来过滤/搜索数据框中行中的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,有两个间隔:
所以: 0 - > 1:startdate和 1 - > 0:结束
我的第一个解决方案是迭代行。但由于真正的数据集非常大,我想知道是否有任何方法可以用熊猫来完成。
感谢。
答案 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
然后starts
和ends
将是两个布尔系列,标记列中的所有开始日期和结束日期' 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}