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

基于变量字段进行分组,然后在python中重置计数器(cumcount),python,python-3.x,pandas-groupby,cumsum,Python,Python 3.x,Pandas Groupby,Cumsum,我创建了一个数据帧 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 我想重新开始计算字段“b”中的新值。计数器应从值“B”开

我创建了一个数据帧

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
我想重新开始计算字段“b”中的新值。计数器应从值“B”开始。这方面的任何输入都会很有帮助

您可以通过以下方式完成此操作:

输出:

    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,这可能不是您想要的-但它取自您提供的代码。

谢谢,这确实非常有用,在transform函数中有介绍。我还计划在pyspark中使用一组类似的函数,即window函数。你能帮忙吗。我可以把它作为一个单独的问题提出来,我不太了解pyspark,作为一个单独的问题可能更好。
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