首页 > 解决方案 > 连续零计数(多索引)

问题描述

我正在尝试计算连续的零:

每次出现非零值时,重新开始binary column计数Consec Column

     binary consec
1       1      0
2       0      1
3       0      2
4       0      3
5       0      4
5       1      0
6       0      1
7       0      2
8       1      0

这个解决方案,我可以做到

df = pd.DataFrame({"binary": [0,1,1,1,0,0,1,1,0]})
df["consec"] = df["binary"].groupby((df["binary"] != 0).cumsum()).cumcount()

   binary  consec
1       1      0
2       0      1
3       0      2
4       0      3
5       0      4
5       1      0
6       0      1
7       0      2
8       1      0

但是,我想对这样的多索引情况做同样的事情:

import pandas as pd
df = pd.DataFrame({"gp_1": [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], "gp_2": [1,1,1,1,1,1,1,1,1,3,3,3,3,4,4,4,4,4], "binary": [0,1,1,1,0,0,1,1,0, 0,1,1,1,0,0,1,1,0]})

预期输出:

  gp_1 gp_2 binary  consec
0   1   1   0         1  
1   1   1   1         0
2   1   1   1         0
3   1   1   1         0
4   1   1   0         1
5   1   1   0         2
6   1   1   1         0
7   1   1   1         0
8   1   1   0         1
9   2   3   0         1
10  2   3   1         0
11  2   3   1         0
12  2   4   0         1
13  2   4   0         2
14  2   4   0         3
15  2   4   1         0
16  2   4   1         0
17  2   4   0         1

标签: pandasnumpy

解决方案


让我们试试

df.groupby([df.gp_1,df.gp_2,df.binary.diff().ne(0).cumsum()]).cumcount().add(1).where(df.binary==0,0)
Out[149]: 
0     1
1     0
2     0
3     0
4     1
5     2
6     0
7     0
8     1
9     1
10    0
11    0
12    1
13    2
14    3
15    0
16    0
17    1
dtype: int64

推荐阅读