我有以下数据框
data =
a b c val
0 'a1' 'b1' 'c1' 5
1 'a1' 'b1' 'c2' 10
2 'a1' 'b2' 'c3' 1
3 'a2' 'b1' 'c4' 30
4 'a2' 'b1' 'c5' 20
5 'a2' 'b1' 'c6' 10
我想创建一个具有相同列的新数据框,其中给定(a,b,c)的值等于所有(aa,bb,cc)的值的总和,如果a == aa,b == bb和值(aa,bb,cc)> =值(a,b,c)。这里aa是a的别名,依此类推。
期望的结果是
data_new =
a b c val
0 'a1' 'b1' 'c1' 15
1 'a1' 'b1' 'c2' 10
2 'a1' 'b2' 'c3' 1
3 'a2' 'b1' 'c4' 30
4 'a2' 'b1' 'c5' 50
5 'a2' 'b1' 'c6' 60
我做了以下事情:
data['key'] = data['a']+data['b']
data_new = data
data_new = data.apply(lambda row: data[ (data.key==row.key)
& (data.val>=row.val) ].val.sum(), axis=1)
del data_new['key']
实际上,在我的实际数据中,我有更多的列,如a和b,这就是为什么布尔比较,如
(data.a==row.a) & (data.a==row.b) & ...
比较慢。问题是,即使是当前的实现也没有我想要的那么快。我有很大的桌子。有没有办法更快地做同样的事情&效率更高?
答案 0 :(得分:2)
如果我了解你,那么你可以使用cumsum
进行一些排序:
>>> grouped = df.sort("val", ascending=False).groupby(["a", "b"])
>>> df["new_val"] = grouped["val"].cumsum()
>>> df
a b c val new_val
0 a1 b1 c1 5 15
1 a1 b1 c2 10 10
2 a1 b2 c3 1 1
3 a2 b1 c4 30 30
4 a2 b1 c5 20 50
5 a2 b1 c6 10 60
由于您想要将一组中的值> =感兴趣的值相加,您可以将这些值按降序排列在A,B组中,然后取这些值的累计总和。