我创建一个数据框
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”开始。在这方面的任何输入都会有所帮助
答案 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,这可能不是您想要的值-但这是从您提供的代码中提取的。