2015-09-30 105 views
2

这里的成员的总和是输入数据框:运行最新最每组

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,因为在该行时间你有2个组,As和Bs,每个都有1行,所以你必须从每个组中取一行。

2)id = 2的行有-1 = -3 + 2,因为那时你有2个组,As和Bs。来自As的最近一行是2 A -3,而来自Bs的单个(因此是最新的)行是1 B 2,因此您需要添加这两行。

3)在使用id = 6行,你把

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

您从每组取1行,这是最近在该点的行。

+0

为什么第二个值是'3'?当第一个ID是'A'并且第二个ID是'B'时。 –

+0

那么,在这一点上,你有2个组,A和B,每个组都有一行。我们的目标是从每个组中获取最近的一行,并且您有2个组,每个组有1行,因此您为它们添加val值并获得2 + 1。 –

回答

0

这应该是一个相对快速和简单的方法来做到这一点使用循环。它的工作方式是每当它找到一个字典时,它就会在字典中添加一个新条目。如果条目已经存在,它会覆盖相应的值。

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()) 
0

我不是熊猫或numpy的专家,所以也许会更好。

函数np.unique带参数return_index=True返回数组的唯一索引。但我需要索引倒置,所以首先我倒置数组,然后通过索引减去它们。功能适用不能访问索引link,因此它从列的长度计数减去colD减去1.列colB的最后值由列colF列表中的索引相加。

# colA colB 
#0 A  1 
#1 B  2 
#2 A -3 
#3 C  1 
#4 D  5 
#5 B  6 
#6 C -2 

#first create cumsum from groups to column colD 
df['colD']= df['colA'].cumsum() 
#return inverted unique indexes 
df['colE']=df['colD'].apply(lambda a: np.unique(list(a[::-1]), return_index=True)[1]) 
#subtracting index for each row to list of indexes 
df['colF']=df['colD'].apply(lambda a: len(a) - 1 - (np.unique(list(a[::-1]), return_index=True)[1])) 
#sum colB by indexes 
df['colG'] = df['colF'].apply(lambda a: sum(df['colB'].ix[a])) 
# colA colB  colD   colE   colF colG 
#0 A  1  A   [0]   [0]  1 
#1 B  2  AB  [1, 0]  [0, 1]  3 
#2 A -3  ABA  [0, 1]  [2, 1] -1 
#3 C  1  ABAC  [1, 2, 0]  [2, 1, 3]  0 
#4 D  5 ABACD [2, 3, 1, 0] [2, 1, 3, 4]  5 
#5 B  6 ABACDB [3, 0, 2, 1] [2, 5, 3, 4]  9 
#6 C -2 ABACDBC [4, 1, 0, 2] [2, 5, 6, 4]  6