之前我们介绍了pandas的分组聚合(传送门:python数据分析实战:pandas之分组聚合),那么对于这个求累计降水的案例,如果不使用分组的功能,能不能用其他方法实现呢?
问题回顾:
现有一次降水过程的逐小时站点观测资料,包括:站号、年、月、日、时以及各气象要素。如何计算每个站点过程的总降水量?如何计算每个站点日总降水量?如何计算12小时累计降水量?
解决思路及方案:
1. 索引
Series是pandas的一维数组对象(DataFrame多维),包含有一个值序列['a','b','c','d','e','f']和一组数据标签RangeIndex(start=0, stop=6, step=1),也称为索引
2. 分层索引
分层索引允许在一个轴向上拥有多个索引层级,提供了一种在低维度的形式中处理高维度数据的方式。
分层索引可以方便地选出数据子集,并按层级进行汇总统计。pandas很多统计函数中有一个参数level,可以控制数据在某个特定的轴上进行聚合,参见下图:
3. 计算站点过程的总降水量
根据上面的背景介绍,我们需要将降水数据在站点上进行聚合,那么就需要先将站点设置为index,然后在level=0上聚合即可得到需要的结果。
4. 计算站点日降水量
需要计算站点日降水量,则需要同时在站点和时间上进行聚合,这里必须使用分层索引
这里进行聚合时需要注意,因为是同时在多个要素上进行聚合,所以level必须指定一个分层索引的列表level=[0,1,2,3]
5. 12小时累计降水
和分局聚和类似,这里按层级聚合之前,也需要将小时这一列信息转为'a'和'b'两种标识。
此时的level记得要把hour这一列带进去,即level=[0,1,2,3,4]
6. 分层索引切片
除了参考分组聚合,将小时的信息替换之外,分层索引还可以通过索引切片来计算12小时累计降水。先将站号、年、月、日和时设为多层索引
将1-12时的数据单独切出来
再指定level=[0,1,2,3]聚合即可得到12小时累计降水