大熊猫的聚合函数如何工作?

时间:2015-12-16 18:58:06

标签: python pandas

我正在尝试通过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())的使用时间要长两倍。

这些在后台做的事情有很大不同吗?

1 个答案:

答案 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略慢。