点击上方“潜心的Python小屋”关注我们,第一时间推送优质文章。
前言
大家好,我是潜心。上篇文章提到了Groupby,但其中举例的代码有点问题,在提取序列时用到了for循环,效率很慢,后来查找了官方文档,才明白apply的重要性,再次对Groupby进行深入并总结。
本文约2.1k字,预计阅读15分钟。
Groupby: split-apply-combine
Pandas中Groupby定义如下:
def groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False)
Groupby具体来说指的是涉及以下一个或多个步骤的过程:
分割(Splitting):根据一些标准将数据划分为多个组。
应用(Applying):独立地对每个组应用一个函数。
组合(Combing):将结果组合成数据结构。

其中,分割是最直接的,也是最常用的(如上图)。但是事实上,在许多情况下,我们可能希望将数据集分成组,并对这些组做一些统计值计算。在Applying中,可能希望做以下其中一项:
聚集(Aggregation):计算每个组的汇总统计信息(或统计信息),例如计算分组的和、均值、个数等。
转换(Transformation):执行一些特定组的计算并返回一个like-indexed对象。
过滤(Filteration):根据判断为真或假的组计算,丢弃一些组。
此次我们不讨论Group的分割问题,主要聚焦它的Applying,并结合实际的大数据量的实际表来比较它们的效率问题。采用的数据表为用户与他点击的广告,共100w条:
| user_id | creative_id | |
|---|---|---|
| 0 | 30920 | 567330 |
| 1 | 30920 | 3072255 |
| 2 | 30920 | 3072255 |
| 3 | 30920 | 3879497 |
| 4 | 30920 | 3751623 |
| ... | ... | ... |
Aggregation
当创建了GroupBy对象,根据需求我们可以对分组的数据执行计算。最简单的是我们通过agg()方法来调用一些Python内置函数进行聚合计算,常用的内置函数为:mean、median、sum、size、count、std、describe、min、max等。
这里我们基于user_id对数据进行划分,简单应用部分内置函数,统计对每个用户他点击过的最大和最小的广告id:
%%time
In[1]: df.groupby('user_id').agg(['count', 'min', 'max'])
CPU times: user 72 ms, sys: 0 ns, total: 72 ms
Wall time: 70.9 ms
Out[1]:
user_id count min max
31 26 109090 4440651
34 63 3983 4266235
36 19 67988 3999372
310 12 10039 3042631
312 28 24918 3904071
... ... ... ...
363305&nbs

本文详细介绍了Pandas中Groupby操作的split-apply-combine思想,重点讨论了Aggregation、Transformation和Filteration。通过实例展示了如何计算每个用户点击广告的统计信息,如最大、最小广告ID。transform方法用于返回与原始数据表大小相同的新对象,而filter则通过布尔判断筛选分组内容。此外,对比了agg和apply方法在性能上的差异,强调了apply的灵活性和高效性。
最低0.47元/天 解锁文章
5961

被折叠的 条评论
为什么被折叠?



