基于变量字段分组,然后在 python 中重置计数器 (cumcount)

Group based on a variable field, and then resetting the counter (cumcount) in python

我创建了一个数据框

df = pd.DataFrame({"b": ['A','A','A','A','B', 'B','B','C','C','D','D', 'D','D','D','D','D','D','D','D','D'],"a": [-3,-4,2, -1, -3, -1,-7,-6, 1, 1, -1, 1,4,5,-3,2,3,4, -1, -2]})

检查负值

df['val'] = df.a < 0

添加一个累积计数和列,当以前的值不为负时,计数器会增加。 (这意味着对于每个负值,计数器增加 1,但如果有多个 -ve 值,则假定它们是单个负值并且计数器仍然增加 1)

df['val_1'] = (((df['val']) & (df['val'] != df['val'].shift())).cumsum()). the table is as below

    b  a    val  val_1
0   A -3   True      1
1   A -4   True      1
2   A  2  False      1
3   A -1   True      2
4   B -3   True      2
5   B -1   True      2
6   B -7   True      2
7   C -6   True      2
8   C  1  False      2
...

我想重新开始计算字段 'b' 中的新值。计数器应从值 'B' 开始。在这方面的任何输入都会有所帮助

您可以使用 groupby-transform:

df['val_2'] = df.groupby('b')['val'].transform(lambda x: ((x) & (x != x.shift())).cumsum())

输出:

    b   a   val     val_1
0   A   -3  True    1
1   A   -4  True    1
2   A   2   False   1
3   A   -1  True    2
4   B   -3  True    1
5   B   -1  True    1
6   B   -7  True    1
7   C   -6  True    1
8   C   1   False   1
9   D   1   False   0
10  D   -1  True    1
11  D   1   False   1
12  D   4   False   1
13  D   5   False   1
14  D   -3  True    2
15  D   2   False   2
16  D   3   False   2
17  D   4   False   2
18  D   -1  True    3
19  D   -2  True    3

请注意,第一个值如果为真则计为 1,这可能不是您想要的 - 但它取自您提供的代码。