上QQ阅读APP看书,第一时间看更新
3.2.4 数据聚合
数据聚合通常是要使每一个数组生成一个单一的数值,以便后续查看和分析结果,比如我们会查看每月的支出情况,计算当月或每天的平均支出等。
数据聚合的一般流程如下:
1)按某字段对数据进行分组拆分;
2)对不同组的数据应用不同的聚合函数进行转换;
3)把不同组得到的结果合并起来。
总结来说,即“拆分→应用→合并”这样一个过程。我们可以通过groupby函数来完成此类操作,还是以前面的用户画像数据为例,部分数据样例如图3-6所示。
图3-6 广告用户画像部分数据样例
例如现在要对System列进行分组,计算Num列的平均值:
In [89]: grp = df.groupby('System')['Num'] In [90]: grp Out[90]: <pandas.core.groupby.SeriesGroupBy object at 0x00000000113B8080>
可以看到grp是Python中的groupby对象,也就是说它是我们数据拆分后的中间结果。如果需要计算平均值,可直接在groupby对象grp上调用mean方法:
In [91]: grp.mean() Out[91]: System android 50.120690 iOS 48.642857 Name: Num, dtype: float64
从输出结果可以看到,System列有两个分组,即android和iOS,以及每个分组下Num的平均值。
另外,如果需要按多个字段分组,我们可以将多个列名放到同一个list中,作为groupby的参数:
In [92]: df.groupby(['System','Sex'])['Num'].mean() Out[92]: System Sex android F 48.861111 M 52.181818 iOS F 40.777778 M 60.500000 未知 24.750000 Name: Num, dtype: float64
Pandas提供了常用的聚合函数来帮助我们进行聚合计算,具体如表3-7所示。
表3-7 常用的聚合函数
同时,我们也可以自定义聚合函数,如下所示:
In [93]: def myfun(obj): ...: return np.mean(obj ** 2 - 10) In [94]: df.groupby(['System'])['Num'].apply(myfun) Out[94]: System android 3338.500000 iOS 3183.738095 Name: Num, dtype: float64
通过apply函数来使用我们自定义的聚合函数,可以理解为对我们拆分好的结果循环调用自定义聚合函数来进行计算。