记录一则群友在微信群里提出的需求,计算多年各月各询的平均降雨量。统计这个多年旬月均值,是为了跟当前年份的旬月值做比较,多了就说明当前月份雨水多,有可能发生洪涝灾害。

群友给的这份数据其实并不完整,日期不是连续的,群友解释缺失的日期表示当天没有下雨。

旬月值=∑每年各月各旬降雨量该旬出现次数旬月值=\frac{\sum每年各月各旬降雨量}{该旬出现次数}旬月值=该旬出现次数∑每年各月各旬降雨量​

首先我们对数据进行简单的清洗。

# 数据文件比较规整,所以用pd.read_csv直接读取
df = pd.read_csv("./10年数据.txt", sep='\t')# 将数据列的dt改为日期类型,并提取日期作为行索引
df.index = pd.to_datetime(df['dt'], format='%Y-%m-%d').dt.date# 补全剩余日期,范围为2006/1/1-2015/9/30,p值默认为0
df = df.reindex(index=pd.date_range(start='2006/1/1', end='2015/9/30'), fill_value=0)# 再一次填补缺失值为0
df.p.fillna(0, inplace=True)# 删除表中多余的dt列
df.drop('dt', axis=1, inplace=True)# 日<=10为上旬,0<日<=20为中旬,日>20为下旬
# 使用cut函数分桶,np.inf代表正无穷,right=True代表右边闭区间,即每个分桶的最大值可以取到bins中的值
df['xun'] = pd.cut(df.index.day, bins=[0, 10, 20, np.inf],labels=['上旬', '中旬', '下旬'], right=True)# 将年月单独提出来方便下一步分组
df['month'] = df.index.month
df['year'] = df.index.yeardf.head()p   xun   month year
2006-01-01 0.0 上旬   1     2006
2006-01-02 0.0 上旬   1     2006
2006-01-03 0.0 上旬   1     2006
2006-01-04 0.0 上旬   1     2006
2006-01-05 0.0 上旬   1     2006

根据月、旬、年进行分组求和。

df.groupby(by=['month', 'xun', 'year']).sum().head()


分组后得到是一个多重索引的DataFrame,我们将其转换为正常的一维数据,使用reset_index()就可以重置索引。

df.groupby(by=['month', 'xun', 'year']).sum().reset_index(level=['month', 'year', 'xun'])


根据上一步得出的DataFrame我们继续按照月、旬分组,计算p的均值,此时得出来的DataFrame依然是多重索引。

df.groupby(by=['month', 'xun', 'year']).sum().reset_index(level=['month', 'year', 'xun']).groupby(by=['month', 'xun'])[['p']].mean()month  xun
1      上旬     1.51中旬     1.75下旬     3.59
2      上旬     2.87中旬     3.49

将上一步得到的DataFrame透视列一下即可得到我们的结果,unstack()可以实现透视列。

df.groupby(by=['month', 'xun', 'year']).sum().reset_index(level=['month', 'year', 'xun']).groupby(by=['month', 'xun'])[['p']].mean().unstack().head()


最后我们将DataFrame稍微美化一下,并附上完整代码。

df = pd.read_csv("./10年数据.txt", sep='\t')# 将数据列的dt改为日期类型,并提取日期作为行索引
df.index = pd.to_datetime(df['dt'], format='%Y-%m-%d').dt.date
# 补全剩余日期,范围为2006/1/1-2015/9/30,p值默认为0
df = df.reindex(index=pd.date_range(start='2006/1/1', end='2015/9/30'), fill_value=0)
# 再一次填补缺失值为0
df.p.fillna(0, inplace=True)
# 删除表中多余的dt列
df.drop('dt', axis=1, inplace=True)
# 日<=10为上旬,0<日<=20为中旬,日>20为下旬
# 使用cut函数分桶,np.inf代表正无穷,right=True代表右边闭区间,即每个分桶的最大值可以取到bins中的值
df['xun'] = pd.cut(df.index.day, bins=[0, 10, 20, np.inf],labels=['上旬', '中旬', '下旬'], right=True)# 将年月单独提出来方便下一步分组
df['month'] = df.index.month
df['year'] = df.index.yeardf_final = df.groupby(by=['month', 'xun', 'year']).sum().reset_index(level=['month', 'year', 'xun']).groupby(by=['month', 'xun'])['p'].mean().map(lambda x: round(x, 2)).unstack()# 修改维度过多的DataFrame列名的小技巧,细细品一下
col = list(df_final.columns)
col.insert(2, col.pop(col.index('下旬')))
df_final = df_final[col]# 删除行列索引的name
df_final.index.name = None
df_final.columns.name = None# 添加表头,并设置背景颜色
df_final.style.set_caption("各月各旬平均降雨量").background_gradient(cmap='Blues')


群友说各月旬值相加应该与月均值相等,我们来测试一下。

# 因为unstack后的列索引是CategoricalIndex,不能按照DataFrame那样直接新增一列
# 所以我将它先转为object类型
df_final.columns = df_final.columns.astype(object)
# 将上中下旬均值求和,保留两位小数
df_final['旬均值求和'] = df_final.apply(sum, axis=1).apply(lambda x: round(x, 2))
# 直接求月均值的话依然需要两次groupby,最后保留两位小数
df_final['月均值'] = df.groupby(by=['month', 'year']).sum().reset_index(level=['month', 'year']).groupby(by='month')['p'].mean().map(lambda x: round(x, 2))
df_final['误差'] = abs(df_final['旬均值求和']-df_final['月均值'])
df_final


完美!

我们可以看出我国降水集中在夏秋两季,尤其是六七月份的梅雨季节,那完完全全就是下图。

又或者脱衣服,洗衣服…我没衣服了。

看到不关注,公众号头像就会成为你的现状


本文源码及数据链接:点这
提取码:akgy

如果有更好的解法欢迎在评论区留言,谢谢!

微信群解答_各月各旬降水量均值_巧用groupby相关推荐

  1. SAP技术专家Jerry的技术分享微信群 - 2021年1月14日更新 - 还剩27个名额

    SAP技术专家Jerry的技术分享微信群 2020年10月19日才创建的微信群,里面会不定期分享我的工作感受和对SAP技术发展方向的个人看法,欢迎扫码加入. 加入群后请将自己的昵称改成如下格式: &l ...

  2. 10000个定制红包 | 微信群建好了,快来咯!

    " 关注hahaCoder 获取最新资讯" 大家好,我是石璞东. 还有5天就是除夕夜了,我在「西安」提前祝大家春节快乐! 1月22号晚,我收到了微信官方开通的微信红包封面定制功能, ...

  3. java微信群自动回复_微信群运营必备的社群管理工具,让你实现月入过万-工具...

    社群运营中需要用到哪些工具呢?都说工欲善其事必先利其器,互联网时代无论做哪一项工作如果能借助工具效率就能有效提高.如果管理微信多个社群进行运营,每天维护广告就要花去很多花去很多时间哪还能进行其他工作的 ...

  4. vuewebsocket做消息提醒_企业微信群怎么定时群发消息?如何突破群发次数限制?...

    文丨语鹦企服私域管家原创,未经授权不得转载 我们在使用企业微信做营销时,经常需要给客户群发通知或活动福利.企业微信提供多客户群群发工具,只需一键群发,即可通知到所有群.但遇上节假日或者忙碌的时候,定时 ...

  5. 钉钉群机器人关键词自动回复_企业微信群机器人怎么用?企业微信群机器人有什么功能?...

    使用企业微信办公时,我们可以在群聊中添加群机器人,自动推送消息,回答客户提问,那么企业微信群机器人怎么添加呢? 因为企业微信内部群机器人和外部群机器人的添加方式有一点区别,下面我们分开来讲述. 内部群 ...

  6. 2018互联网行业寒冬裁员实录:整个11月 公司微信群里消失了200多人

    作者 | 刘娉婷 来自 | 第一财经 "没想到裁员来得这么快,也没想到会先从我开始."在创业公司工作的一年多以来,市场部经理李远的考核成绩一直是最好等级,但这并不能改变他被裁员的事 ...

  7. 付费入群怎么做_微信群怎么设置付费才可以进入

    如果我们有资源,有特立独行的表情包,或者有渠道,我们就可以通过付费进群的功能设置需要资源的用户可以扫码付费之后加入可以获取有趣的有价值的资源包或者表情包,需要实现付费进群功能也非常的简单,我们只需要准 ...

  8. 微信群创意活动_一小群制造商将大创意转变为用户社区

    微信群创意活动 相信在一个更加协作的过程中. 坚持不懈地使事情变得更好. 所有人共享知识和访问. 这些是我想到e-NABLE社区正在从事的工作时想到的事情. 尽管他们的发展轨迹不明朗,但他们的愿景却是 ...

  9. python自动发微信新闻_微信群总有人发广告?用Python写一个自动化机器人消灭他...

    作者 | 刘早起 出品 | 早起Python(ID: zaoqi-python) 或者是一声不吭的去骚扰每一个群成员. 虽然不清楚是什么能够驱使他们这样不折不扣的努力成为最强微信群牛皮癣(可能是钞能力 ...

  10. Python 微信自动化工具开发系列04_所有微信群的群文件自动同步拷贝到群名对应的新文件夹中(2023年1月可用)

    前言 一个需求需要利用Python+第三方库wxauto 用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理, 比如自动回复,再比如自动发送文件或者其他.--- 记录于2022年08月 ...

最新文章

  1. Mac系统的终端显示git当前分支
  2. mysql模糊查询指定根据第几个字符来匹配
  3. python asyncio 异步编程-协程 2
  4. 使用云原生buildpacks将你的代码转换成Docker Image | 技术头条
  5. 特征提取算法 知乎_对话 | 港科大教授权龙:为什么三维重建才是计算机视觉的灵魂?...
  6. 【2020牛客寒假基础算法训练营】第三场总结
  7. LESS+to+MCSS
  8. html 微信扫码登录,前端使用微信扫码登录
  9. redis mset是否具有原子性
  10. 西安电子科技大学计算机学院评论,放弃985,选择西安电子科技大学计算机专业,网友表示没毛病...
  11. 计算机前沿技术科论文,计算机前沿技术论文
  12. DECOUPLED WEIGHT DECAY REGULARIZATION
  13. LabVIEW使用入门指导
  14. docker容器时间错误解决方案
  15. 李建忠设计模式——策略模式Strategy
  16. 幽默搞笑:我赶紧把手抽开,这死胖子暗恋我十年,死心不改啊
  17. 机械材料热处理工艺1(必备知识点)
  18. 如何用WxJump成功解决生成在微信可用的网址二维码的API接口
  19. 香港服务器怎么样?到底好不好?
  20. DaVinci使用笔记(0)

热门文章

  1. 状语从句不是简单句_简单句、并列句、复合句
  2. ps把图片无损放大的方法
  3. 手把手教你如何用PhotoShop制作gif动画
  4. mac 建 android 签名,mac android app 签名工具
  5. scala_day01_安装_基础_IO_函数_递归_异常_方法_样例类_伴生对象
  6. 如何给电脑做磁盘分区
  7. pr基础操作与快捷键(基于pr cc 2017)
  8. unity3d之计算两向量的旋转角
  9. Tushare介绍和入门级实践(2)——使用tushare接口获取沪深300成分股的财报数据并输出到本地
  10. python实战笔记之(4):刷博客浏览量