首页 > 解决方案 > 模式识别和序列检测

问题描述

我有一个看起来像这样的数据集“df”:

MEMBER  seen_1   seen_2   seen_3   seen_4   seen_5   seen_6
  A       1        0        0         1       0        1
  B       1        1        0         0       1        0
  C       1        1        1         0       0        1
  D       0        0        1         0       0        1

如您所见,有几行 1 和 0。任何人都可以建议我在 python 中编写一个代码,这样我就可以计算在第一次出现 1、0 和 0 之前连续出现的次数 1、0 和 0。例如,对于成员 A,第一个双零事件发生在 seen_2 和 seen_3,因此事件将为 1。同样对于成员 B,第一个双零事件发生在 see_3 和 seen_4,因此在此之前发生了两个 1 . 结果表应该有一个新列“事件”,如下所示:

MEMBER  seen_1   seen_2   seen_3   seen_4   seen_5   seen_6  event 
  A       1        0        0         1       0        1       1
  B       1        1        0         0       1        0       2
  C       1        1        1         0       0        1       3
  D       0        0        1         0       0        1       1

标签: python-3.xpandasdataframepattern-matching

解决方案


我的做法:

df = df.set_index('MEMBER')

# count 1 on each rows since the last 0
s = (df.stack()
       .groupby(['MEMBER', df.eq(0).cumsum(1).stack()])
       .cumsum().unstack()
    )

# mask of the zeros:
u = s.eq(0)

# look for the first 1 0 0
idx = (~u & 
        u.shift(-1, axis=1, fill_value=False) & 
        u.shift(-2, axis=1, fill_value=False) ).idxmax(1)

# look up
df['event'] = s.lookup(idx.index, idx)

测试数据:

  MEMBER  seen_1  seen_2  seen_3  seen_4  seen_5  seen_6
0      A       1       0       1       0       0       1
1      B       1       1       0       0       1       0
2      C       1       1       1       0       0       1
3      D       0       0       1       0       0       1
4      E       1       0       1       1       0       0

输出:

  MEMBER  seen_1  seen_2  seen_3  seen_4  seen_5  seen_6  event
0      A       1       0       1       0       0       1      1
1      B       1       1       0       0       1       0      2
2      C       1       1       1       0       0       1      3
3      D       0       0       1       0       0       1      1
4      E       1       0       1       1       0       0      2

推荐阅读