Pandas应用与lambda函数效率

2024-04-18 17:49:50 发布

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

我有以下数据帧

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) & ...

比较慢。问题是,即使是目前的实施也没有我想要的那么快。我有很多桌子。有没有什么方法可以更快、更高效地完成同样的事情?在


Tags: 数据keya2newdatavaluea1val
1条回答
网友
1楼 · 发布于 2024-04-18 17:49:50

如果我理解您的意思,那么您可以使用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组中,然后取这些值的累计和。在

相关问题 更多 >