Python 每个组最近成员的运行总和

Python 每个组最近成员的运行总和,python,pandas,group-by,dataframe,cumsum,Python,Pandas,Group By,Dataframe,Cumsum,以下是输入数据框: id val 0 A 1 1 B 2 2 A -3 3 C 1 4 D 5 5 B 6 6 C -2 我想按id对条目进行分组,然后计算到目前为止看到的每个组的最新成员的运行总和。以下是所需输出的样子,并解释了如何获得: id val out 0 A 1 1 1 B 2 3 (2 + 1) 2 A -3 -1 (-3 + 2) 3 C 1 0 (1+

以下是输入数据框:

  id  val
0  A    1
1  B    2
2  A   -3
3  C    1
4  D    5
5  B    6
6  C   -2
我想按id对条目进行分组,然后计算到目前为止看到的每个组的最新成员的运行总和。以下是所需输出的样子,并解释了如何获得:

  id  val  out
0  A    1   1
1  B    2   3   (2 + 1)
2  A   -3   -1  (-3 + 2)  
3  C    1   0   (1+ -3 +2)
4  D    5   5   (5 + 1 + -3 + 2_
5  B    6   9   (6 + 5 + 1 + -3)
6  C   -2   6    (-2 + 6 + 5 -3)
以下是一些更详细的解释: 1) id=1的行有3=2+1,因为当时有两个组,As和Bs,每个组有一行,所以必须从每个组中提取这一行

2) id=2的行具有-1=-3+2,因为在那个时候,您有两个组,As和Bs。As中最近的一行是
2A-3
,而Bs中的单个(因此也是最近的)行是
1B-2
,因此您可以添加这两行

3) 在id=6的行中,您可以相加

2  A   -3
4  D    5
5  B    6
6  C   -2

您将从每个组中选取一行,这是此时最新的一行。

使用循环应该是一种相对快速且简单的方法。它的工作方式是,只要找到一个新条目,它就会向字典中添加一个新条目。如果条目已存在,则会覆盖相应的值

df = pd.DataFrame({'id': ['A','B','A','C','D','B','C'],
                  'val': [1,2,-3,1,5,6,-2]})

num_rows = df.shape[0]

last_vals = {}
for i in range(0, num_rows):
    x = df['id'][i]
    last_vals[x] = df['val'][i]

sum(last_vals.values())

为什么第二个值是
3
?当第一个组的id为
A
而第二个组的id为
B
时,此时,您有两个组,A和B,每个组有一行。目标是从每个组中获取最新的行,您有两个组,每个组有一行,因此您为它们添加val值,得到2+1。