Pandas - 如何在不使用循环的情况下将不同的 类 分配给循环序列?

Pandas - How to assign different classes to a recurring series without using a loop?

我在 pandas 数据框中有一个包含重复值的系列。前 20 个值如下:

# input
[-1,  1, -1,  1,  1, -1,  1, -1,  1, -1,  1,  1,  1,  1,  1,  1, -1, 1,  1,  1]

请注意,-1 表示新 class 的开始,而 1 表示前一个 class 的延续。 我可以将“-1”和“1”更改为编码的任何值。 我想要的输出是 class 标签,如下所示:

# output
[0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5]

目前我已经使用 for 循环完成了此操作。 我找不到使用内置 pandas / python 函数的更好方法。

如何在不使用 for 循环的情况下实现这一点?

比较 -1 的值并使用 Series.cumsum 的累积和,如果系列的第一个值是 0 减去 1:

s = pd.Series([-1,  1, -1,  1,  1, -1,  1, -1,  1, -1,  1,  1, 
                1,  1,  1,  1, -1, 1,  1,  1])

s1 = s.eq(-1).cumsum()
out = s1.sub(1) if s[0] == -1 else s1

如果总是第一个值是 -1 减去 1:

out = s.eq(-1).cumsum().sub(1)