是否可以直接计算两列的乘积(或例如总和)而不使用
grouped.apply(lambda x: (x.a*x.b).sum()
Run Code Online (Sandbox Code Playgroud)
它的使用速度更快(在我的机器上不到一半的时间)
df['helper'] = df.a*df.b
grouped= df.groupby(something)
grouped['helper'].sum()
df.drop('helper', axis=1)
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢这样做.例如,计算每组的加权平均值是有用的.lambda方法就是这样
grouped.apply(lambda x: (x.a*x.b).sum()/(df.b).sum())
Run Code Online (Sandbox Code Playgroud)
并且再次比将助手除以b.sum()慢得多.
我想最终构建一个嵌入式数组表达式求值器(类固醇上的Numexpr)来做这样的事情.现在我们正在处理Python的局限性 - 如果你实现了一个Cython聚合器,(x * y).sum()
那么它可以与groupby连接,但理想情况下你可以将Python表达式编写为函数:
def weight_sum(x, y):
return (x * y).sum()
Run Code Online (Sandbox Code Playgroud)
这将得到"JIT编译",并且与groupby(...)一样快.sum().我所描述的是一个非常重要的(许多月)项目.如果有一个兼容BSD的APL实现,我可能会更快地做一些类似上面的事情(只是大声思考).
归档时间: |
|
查看次数: |
4844 次 |
最近记录: |