按第二列排序的列中每组的 cumsum 附加到原始数据帧

use*_*461 5 python numpy pandas

我有一个包含多个组的 2 列数据框,在这种情况下,第 1 列包含组,第 2 列组(在这种情况下,日期必须按正确顺序排列)。我想要按 col2 排序的 col1 中每个唯一组的第三列的累积总和。

我还没有找到一种优雅的方法来实现这一点。以下代码将正确完成任务,但对整个表进行求和,并且非常依赖于所有排序是否正确。

multidf = df.groupby(by=['col1','col2']).sum().groupby(level=[0]).cumsum() 将提供分层索引解决方案,但我找不到一种方法来获取结果累积总和列并将其附加到原始数据帧而无需多步合并命令。reset_index 命令只是将表转换回其原始状态。

寻找更好的方法来实现所需的输出,如图所示。我弄乱了 lambda、apply、aggregrate 命令不能完全发挥作用。

In[229]: df#example dataframe
Out[229]: 
  col1                 col2  col3
0    a  2013/01/03 00:00:00     1
1    a  2013/03/05 09:43:31     3
2    b  2013/03/07 00:00:00     4
3    b  2013/03/07 00:00:00     2
4    a  2013/03/07 00:00:00     0

import numpy as np
import pandas as pd
##example dataframe
df = pd.DataFrame({'col1' : ['a','a','b','b','a'],
               'col2' : ['2013/01/03 00:00:00', '2013/03/05 09:43:31', '2013/03/07 00:00:00',\
                         '2013/03/07 00:00:00', '2013/03/07 00:00:00'],
               'col3' : [1,3,4,2,0]})
df = df.sort(['col1','col2'])
jj= df.groupby(by = ['col1'],sort=['col1','col2']).cumsum()

df = df.sort(['col1','col2'])

##multi alternative, can't get result back into original df elegantly
multidf = df.groupby(by=['col1','col2']).sum().groupby(level=[0]).cumsum()

df['cumsum'] = jj['col3']
In[227]: df ## result of unelegant method, desired output though how else can i achieve this?
Out[227]: 
  col1                 col2  col3 cumsum
0    a  2013/01/03 00:00:00     1      1
1    a  2013/03/05 09:43:31     3      4
4    a  2013/03/07 00:00:00     0      4
2    b  2013/03/07 00:00:00     4      4
3    b  2013/03/07 00:00:00     2      6
Run Code Online (Sandbox Code Playgroud)

use*_*212 4

将要排序的列设置为索引会更容易。然后使用groupby.transform(pd.Series.cumsum). 见下文:

In [1]: df
Out[1]: 
  col1                 col2  col3
0    a  2013/01/03 00:00:00     1
1    a  2013/03/05 09:43:31     3
2    b  2013/03/07 00:00:00     4
3    b  2013/03/07 00:00:00     2
4    a  2013/03/07 00:00:00     0

In [2]: df1=df.set_index('col2').sort_index()
In [3]: df1
Out[3]: 
                    col1  col3
col2                          
2013/01/03 00:00:00    a     1
2013/03/05 09:43:31    a     3
2013/03/07 00:00:00    b     4
2013/03/07 00:00:00    b     2
2013/03/07 00:00:00    a     0


In [4]: df1['cumsum']=df1.groupby('col1')['col3'].transform(pd.Series.cumsum)

In [5]: df1
Out[5]: 
                    col1  col3  cumsum
col2                                  
2013/01/03 00:00:00    a     1       1
2013/03/05 09:43:31    a     3       4
2013/03/07 00:00:00    b     4       4
2013/03/07 00:00:00    b     2       6
2013/03/07 00:00:00    a     0       4
Run Code Online (Sandbox Code Playgroud)