我有以下数据帧
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==aa,b==bb和value(aa,bb,cc)>;=value(a,b,c)的值等于所有(aa,bb,cc)的值之和。这里aa是a的别名,依此类推。在
期望的结果是
^{pr2}$我要做的是:
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) & ...
比较慢。问题是,即使是目前的实施也没有我想要的那么快。我有很多桌子。有没有什么方法可以更快、更高效地完成同样的事情?在
如果我理解您的意思,那么您可以使用
cumsum
进行一些排序:由于您希望将一组中的这些值相加,而该组中的值是>;=感兴趣的值,因此可以将这些值按降序放入a、B组中,然后取这些值的累计和。在
相关问题 更多 >
编程相关推荐