GroupBy在Python Pandas中起作用,如SUM(col_1 * col_2),加权平均等

时间:2012-04-04 10:38:56

标签: python pandas

是否可以在不使用

的情况下直接计算两列的乘积(或总和)
grouped.apply(lambda x: (x.a*x.b).sum()

使用

的速度更快(在我的机器上不到一半的时间)
df['helper'] = df.a*df.b
grouped= df.groupby(something)
grouped['helper'].sum()
df.drop('helper', axis=1)

但我真的不喜欢这样做。 例如,计算每组的加权平均值是有用的。这里的lambda方法是

grouped.apply(lambda x: (x.a*x.b).sum()/(df.b).sum())

再次比将助手除以b.sum()慢得多。

3 个答案:

答案 0 :(得分:8)

我想最终构建一个嵌入式数组表达式求值程序(类固醇上的Numexpr)来做这样的事情。现在我们正在处理Python的局限性 - 如果你实现了一个Cython聚合器来执行(x * y).sum(),那么它可以与groupby连接,但理想情况下你可以将Python表达式编写为函数:

def weight_sum(x, y):
    return (x * y).sum()

这将得到“JIT编译”并且与groupby(...)一样快.sum()。我所描述的是一个非常重要的(许多月)项目。如果有一个兼容BSD的APL实现,我可能会更快地做一些类似上面的事情(只是大声思考)。

答案 1 :(得分:0)

如何直接对x.a * x.b的结果进行分组,例如:

from pandas import *
from numpy.random import randn
df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
               'foo', 'bar', 'foo', 'foo'],
        'B' : ['one', 'one', 'two', 'three',
               'two', 'two', 'one', 'three'],
        'C' : randn(8), 'D' : randn(8)})

print (df.C*df.D).groupby(df.A).sum()

答案 2 :(得分:0)

许多年后通过pydata blaze

得出答案
from blaze import *
data = Data(df)
somethings = odo(
by(data.something, 
   wm = (data.a * data.weights).sum()/data.weights.sum()),
pd.DataFrame)