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