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还不能完全理解源代码所做的事情,但这无疑是一个很好的学习机会。