我正在尝试通过groupby
了解发生了什么,并在pandas中聚合函数。例如,以下是4种不同方式获得按组计算的时间结果:
df = pd.DataFrame({'a': np.random.randint(0,3,10),
'b': np.random.rand(10)})
%timeit df.groupby('a')['b'].sum()
1000 loops, best of 3: 287 µs per loop
%timeit df.groupby('a')['b'].agg(sum)
1000 loops, best of 3: 296 µs per loop
%timeit df.groupby('a')['b'].apply(sum)
1000 loops, best of 3: 700 µs per loop
%timeit df.groupby('a')['b'].apply(lambda x: x.sum())
1000 loops, best of 3: 743 µs per loop
仅从时间开始,看起来.sum()
和.agg(sum)
非常相似,但.apply(sum)
和.apply(lambda x: x.sum())
的使用时间要长两倍。
这些在后台做的事情有很大不同吗?
答案 0 :(得分:2)
我的两分钱:
agg(F)
只需拨打aggregate(F)
即可。首先,如果aggregate()
是F
函数(或存在等效的cython
函数),将确定cython
。如果是这样,aggregate(F)
将成为对.F
对象的groupby
方法的调用,这是一种优化的cython
方法。只有很多函数会以这种方式处理,完整列表由_cython_table
字典定义到源代码的最后。 sum
就是其中之一。
显然,使用cython
函数意味着事情往往会更快。但是,对于.agg(F)
,它需要再运行几行代码,因此比.F()
略慢,F
就在_cython_table
并且.F
方法存在。
apply(F)
calles _python_apply_general
。顾名思义,它是一种通用的提议方法。在引擎盖下,它不会尝试检查是否存在更快cython
版本的aggerate函数。它将F
应用于每个组并将结果组合在一起,这意味着它将比优化的cython
版本等效(例如.sum
)运行得慢。
最后,由于额外的apply(lambda x: F(x))
功能,apply(F)
会比lambda
略慢。