如何将pandas日度DataFrame转换为月度最大值的平均值?
问题描述
现有存储1973-2013年日降雨量数据的DataFrame,时间为索引,仅tp1一列存储降雨量数值,结构示例如下:
tp1 time 1973-04-01 0.1 1973-07-01 0.4 1973-08-01 0.0 1973-12-01 0.5 1973-01-17 0.0 ... 2013-10-09 0.0 2013-11-09 0.2 2013-12-09 0.0 2013-09-13 0.4 2013-09-14 0.0 [6432 rows x 1 columns]
计算目标:
- 先统计每一年每个自然月的日降雨量最大值
- 再对所有年份同月份的月度最大值取平均,最终输出12行结果,列名为
Average of Maximum Daily Rainfall in each Month,行索引为月份英文缩写,格式参考如下:
Average of Maximum Daily Rainfall in each Month Jan x Feb x March x April x May x June x Jul x ....
已尝试执行data = df.groupby(df.index.month).max(),返回结果为所有年份对应月份的全局最大值,不符合预期。
正确实现方案
核心逻辑是做两层分组聚合:第一层按「年份+月份」分组,计算每个独立自然月的日降雨量最大值;第二层仅按月份分组,对所有年份的同月份月度最大值求平均。
可直接运行的代码
# 第一层分组:按年、月维度拆分,计算每个月的日降雨量最大值 monthly_max = df.groupby([df.index.year, df.index.month])['tp1'].max() # 第二层分组:按月份维度聚合,计算多年月度最大值的平均值 result = monthly_max.groupby(level=1).mean() # 格式化输出:将数字月份替换为英文缩写,设置指定列名 month_map = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] result.index = [month_map[month_num - 1] for month_num in result.index] result = result.to_frame('Average of Maximum Daily Rainfall in each Month')
原有写法问题说明
单层级按月份分组后直接调用max(),会直接取所有年份该月份下全部日数据的最大值,也就是跨年份的全局月极值,跳过了「先按年拆分计算每个自然月最大值」的步骤,因此结果不符合要求。
内容的提问来源于stack exchange,提问作者jw99
相关产品推荐
相关产品推荐

