9

是否可以直接计算两列的乘积(或例如总和)而不使用

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() 慢得多。

4

3 回答 3

8

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

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

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

于 2012-04-07T20:18:37.160 回答
0

直接对xa*xb的结果进行分组怎么样,例如:

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()
于 2012-04-07T13:02:28.190 回答
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)
于 2016-08-02T13:48:44.293 回答