熊猫适用和lambda功能效率

时间:2014-07-18 20:11:38

标签: python pandas lambda apply

我有以下数据框

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

比较慢。问题是,即使是当前的实现也没有我想要的那么快。我有很大的桌子。有没有办法更快地做同样的事情&效率更高?

1 个答案:

答案 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组中,然后取这些值的累计总和。