根据变量字段进行分组,然后在python中重置计数器(累积数)

时间:2019-07-10 13:15:30

标签: 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

添加一个累计计数总和列,当先前值不为负时,计数器将增加。 (这意味着对于每个负值,计数器将增加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”开始。在这方面的任何输入都会有所帮助

1 个答案:

答案 0 :(得分:2)

您可以使用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

请注意,如果第一个值为true,则将其计为1,这可能不是您想要的值-但这是从您提供的代码中提取的。