基于变量字段进行分组,然后在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