在Python中,我想基于二进制列创建一个“group_id”列,其中计数为1的值增加并为0保持不变

问题描述 投票:0回答:1

对于每个 = 1 的二进制,group_id 应该增加,但将所有连续的 0 分组到一个 group_id 中,下一组连续的 0 位于另一个 group_id 中。

我一直在用

df['group_id1'] = df['diff'].cumsum()

并获取 group_id1 列作为结果。我正在寻找的结果是group_id2。

    diff    group_id1   group_id2
0   1   1   1
1   0   1   2
2   0   1   2
3   0   1   2
4   0   1   2
5   0   1   2
6   0   1   2
7   0   1   2
8   0   1   2
9   1   2   3
10  1   3   4
11  1   4   5
12  1   5   6
13  1   6   7
14  1   7   8
15  1   8   9
16  1   9   10
17  1   10  11
18  0   10  12
19  0   10  12
python pandas group-by binary cumsum
1个回答
0
投票

假设你只有0/1,你可以使用

diff
来识别1前面的0:

df['group_id2'] = (df['diff'].eq(1)|df['diff'].diff().eq(-1)).cumsum()

如果您有其他值,请选择

shift
:

df['group_id2'] = (df['diff'].eq(1)
                  |(df['diff'].eq(0)&df['diff'].shift().eq(1))
                  ).cumsum()

另一种变体:

s = df['diff'].eq(1)
df['group_id2'] = (s|s.shift()).cumsum()

输出:

    diff  group_id2
0      1          1
1      0          2
2      0          2
3      0          2
4      0          2
5      0          2
6      0          2
7      0          2
8      0          2
9      1          3
10     1          4
11     1          5
12     1          6
13     1          7
14     1          8
15     1          9
16     1         10
17     1         11
18     0         12
19     0         12
© www.soinside.com 2019 - 2024. All rights reserved.