Python pandas中的聚合函数是如何工作的?

Python pandas中的聚合函数是如何工作的?,python,pandas,Python,Pandas,我试图了解熊猫中的groupby和聚合函数在引擎盖下发生了什么。例如,以下是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'

我试图了解熊猫中的
groupby
和聚合函数在引擎盖下发生了什么。例如,以下是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())
花费的时间是前者的两倍多

这些人在后台做着截然不同的事情吗?

我的两分钱:

agg(F)
只需调用
aggregate(F)
。首先,如果
F
cython
函数(或存在等效的
cython
函数),则将确定
aggregate()
。如果是这样,
aggregate(F)
将成为对
groupby
对象的
.F
方法的调用,该方法是一种优化的
cython
方法。只有一些函数将以这种方式处理,完整列表由源代码末尾的
\u cython\u table
字典定义
sum
就是其中之一

显然,使用
cython
函数意味着运行速度更快。然而,使用
.agg(F)
,它将需要运行更多的代码行,因此将略慢于
.F()
,甚至
F
\u cython\u表中,并且存在
.F
方法

apply(F)
调用
\u python\u apply\u general
。顾名思义,它是一种通用的建议方法。在引擎盖下,它不会尝试检查是否存在更快的聚合函数版本。它将
F
应用于每个组,并将结果组合在一起,这意味着它将比优化后的
cython
版本(例如
.sum
)运行得慢


最后,
apply(lambda x:F(x))
将比
apply(F)
稍微慢一些,这是由于附加的
lambda
功能。

我想所有的都隐藏了。4210行,谢谢。我希望对这一点有很好理解的人能够总结一下。我的python还不能完全理解源代码所做的事情,但这无疑是一个很好的学习机会。