Python 将数据帧累积和函数转换为;“重新启动”;当行中的值更改时
Python 将数据帧累积和函数转换为;“重新启动”;当行中的值更改时,python,pandas,Python,Pandas,df['total']=(df.DR-df.CR).cumsum() 正在给予: ... Name DR CR total 303 B3 46.80 0.00 46682.07 304 B3 45.20 0.00 467
df['total']=(df.DR-df.CR).cumsum()
正在给予:
...
Name DR CR total
303 B3 46.80 0.00 46682.07
304 B3 45.20 0.00 46727.27
395 BS1 0.00 10.37 47905.31
396 BS2 0.00 87.00 47818.31
397 C 0.00 482.10 47336.21
399 C 20.00 0.00 47356.21
但是,每当“Name”
列(B3、BS1、C)更改为不同的值时,我希望cumsum“重新启动”
因此,期望的结果是:
Name DR CR total
303 B3 46.80 0.00 46.80
304 B3 45.20 0.00 1.60
395 BS1 0.00 10.37 -10.37
396 BS2 0.00 87.00 -97.37
397 C 0.00 482.10 -482.10
399 C 20.00 0.00 -462.10
Name DR CR total
303 B3 46.8 0.00 46.80
304 B3 45.2 0.00 92.00
395 BS1 0.0 10.37 -10.37
396 BS1 0.0 87.00 -97.37
397 C 0.0 482.10 -482.10
399 C 20.0 0.00 -462.10
我对熊猫不熟悉。谢谢你的帮助
我尝试过以下方法,但没有成功:
df['total']=df.groupby('GL')[(df.DR-df.CR)].cumsum()
第一个变量-如果要将每个名称的所有行“连接”到
a单个组:
df['total'] = df.groupby('Name').apply(lambda grp:
(grp.DR - grp.CR).cumsum()).reset_index(level=0, drop=True)
对于源数据,结果是:
Name DR CR total
303 B3 46.80 0.00 46.80
304 B3 45.20 0.00 1.60
395 BS1 0.00 10.37 -10.37
396 BS2 0.00 87.00 -97.37
397 C 0.00 482.10 -482.10
399 C 20.00 0.00 -462.10
Name DR CR total
303 B3 46.8 0.00 46.80
304 B3 45.2 0.00 92.00
395 BS1 0.0 10.37 -10.37
396 BS1 0.0 87.00 -97.37
397 C 0.0 482.10 -482.10
399 C 20.0 0.00 -462.10
第二个变体-如果名称发生任何更改,则启动新组
假设您的数据帧包含:
Name DR CR
303 B3 46.8 0.00
304 B3 45.2 0.00
395 BS1 0.0 10.37
396 BS1 0.0 87.00
397 C 0.0 482.10
399 C 20.0 0.00
400 B3 53.0 8.00
401 B3 40.8 6.15
第二个B3组分别与
第一组:
df['total'] = df.groupby((df.Name != df.Name.shift()).cumsum())\
.apply(lambda grp: (grp.DR - grp.CR).cumsum()).reset_index(level=0, drop=True)
获取:
Name DR CR total
303 B3 46.8 0.00 46.80
304 B3 45.2 0.00 92.00
395 BS1 0.0 10.37 -10.37
396 BS1 0.0 87.00 -97.37
397 C 0.0 482.10 -482.10
399 C 20.0 0.00 -462.10
400 B3 53.0 8.00 45.00
401 B3 40.8 6.15 79.65
如您所见,第二个B3组分别求和。这是否回答了您的问题
df.Name.ne(df.Name.shift()).cumsum()将在Name
上为您提供连续的块,您可以按块分组。但是我不能将你的total
与你的数据联系起来。这不起作用df['total']=df.groupby('Name')['DR'-'CR'].cumsum()或df['total']=df.groupby('Name')[(df.DR-df.CR)]。cumsum()不起作用。第二行的结果没有真正意义。1.6不是46.8和45.2的交换和。你能详细说明一下吗?