python - 按第二列排序的列中每组的 cumsum 追加到原始数据框

标签 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

最佳答案

将要排序的列设置为索引会更容易。然后使用 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

关于python - 按第二列排序的列中每组的 cumsum 追加到原始数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24248674/

相关文章:

python - Pandas:如何通过最接近的索引匹配来组合两个数据帧?

python - 从python列表中选择两个数字,其概率随着它们之间的相对距离而衰减

python - Pandas:根据目标分布从 DataFrame 中采样

python - 将 Pandas DataFrame 转换为 JSON

python - 算法线性 - 使用 While 进行记录。使用大O

python - 在没有 for 循环的情况下对多维数组的时间序列进行去趋势化

python - 如何向 numpy.ndarray 添加标签?

python - Pandas - 在索引中使用 merge_asof 函数

python - 如何在 Pandas 中应用通配符

python - 值错误 : array is too big when loading GoogleNews-vectors-negative