是否可以在不使用
的情况下直接计算两列的乘积(或总和)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()慢得多。
答案 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)