Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧累积和函数转换为;“重新启动”;当行中的值更改时_Python_Pandas - Fatal编程技术网

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的交换和。你能详细说明一下吗?