如何在python中计算多列的按累计和分组

2024-06-20 12:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集

data=pd.DataFrame({'id':pd.Series([1,1,1,2,2,3,3,3]),'var1':pd.Series([1,2,3,4,5,6,7,8]),'var2':pd.Series([11,12,13,14,15,16,17,18]),
'var3':pd.Series([21,22,23,24,25,26,27,28])})

这里我需要根据id计算所有列(var1、var2、var3)的groupwise累计和。 我如何编写python代码以根据我的要求将输出装箱?在

提前谢谢。在


Tags: 数据代码iddataframedataseriespd装箱
2条回答

我不熟悉您所使用的pd对象的标识,但是我理解您的问题的方式是您有一个标签列表(在代码中用id表示),它们对应于几个长度相等的列表(在代码中表示为var1var2,和{}),并且您希望对共享同一标签的项求和,请执行以下操作:这对于每个标签,并返回结果。在

以下代码解决了一般问题(假设标签数组已排序):

def cumsum(A):
 from operator import add
 return reduce(add, A) # cumulative sum of array A

def cumsumlbl(A, lbl):
 idx = [lbl.index(item) for item in set(lbl)] # begin index of each lbl subsequence
 idx.append(len(lbl)) # last index doesn't get added in the above line

 return [cumsum(A[i:j]) for (i,j) in zip(idx[:-1], idx[1:])]

或者使用出现在hereMarkus Jarderot代码的修改版本:

^{pr2}$

测试:

if __name__ == '__main__'
 A = [1, 2, 3, 4, 5, 6]
 lbl = [1, 1, 2, 2, 2, 3]
 print cumsumlbl(A, lbl)

输出:

[3, 12, 6]

如果我理解正确,您可以使用DataFrame.groupby计算按'id'-列分组的列的累计和。比如:

import pandas as pd
data=pd.DataFrame({'id':[1,1,1,2,2,3,3,3],'var1':[1,2,3,4,5,6,7,8],'var2':[11,12,13,14,15,16,17,18], 'var3':[21,22,23,24,25,26,27,28]})
data.groupby('id').apply(lambda x: x.drop('id', axis=1).cumsum(axis=1).sum())

相关问题 更多 >