Pandas多索引列下日度转月度再转年度重采样方法问询
基于月度聚合数据生成年度统计的解决方案
你需要基于已有的月度聚合数据dfm(而非原始日度数据)计算年度统计,这样得到的min、max、mean都是月度级别的汇总值,而非无参考价值的日度值。
解决方案代码
import pandas as pd # 创建示例数据框 df = pd.DataFrame({'date' : pd.date_range(start='1/1/2023', end='12/31/2023', freq='D'), 'code' : [1,2,3,4,5] * 73, 'value': range(365)}) # 设置date为索引 df = df.set_index('date') # 生成月度聚合数据dfm dfm = df.groupby('code').resample("M").agg({ 'value': ['sum', 'min', 'mean', 'max'], }).round() # --- 核心步骤:基于dfm生成年度统计dfm_y --- # 1. 从dfm的索引中提取年份,作为分组依据 year_groups = dfm.index.get_level_values('date').dt.year # 2. 按code和年份分组,对月度指标做年度聚合 dfm_y = dfm.groupby(['code', year_groups]).agg( # 年度总支出:所有月度sum的总和 annual_total=(('value', 'sum'), 'sum'), # 年度内月度支出总和的统计 monthly_sum_min=(('value', 'sum'), 'min'), monthly_sum_max=(('value', 'sum'), 'max'), monthly_sum_mean=(('value', 'sum'), 'mean'), # 年度内月度日度最小值的统计(全年各月度最低日支出的最小值) monthly_day_min=(('value', 'min'), 'min'), # 年度内月度日均支出的平均值 monthly_day_mean=(('value', 'mean'), 'mean'), # 年度内月度日度最大值的统计(全年各月度最高日支出的最大值) monthly_day_max=(('value', 'max'), 'max') ).round() # 可选:重置索引让结果更易读 dfm_y = dfm_y.reset_index().rename(columns={'level_1': 'year'})
关键说明
- 直接从
dfm(月度聚合结果)分组,而非原始日度数据,确保所有统计值都是基于月度汇总后的计算。 - 使用多索引列的元组
(('value', 'sum'), 'min')指定:对dfm中value下的sum列(即月度支出总和),计算年度内的最小值。 - 最后重置索引可以把年份从索引转为列,让结果更直观。
内容的提问来源于stack exchange,提问作者Phil P.
相关产品推荐
相关产品推荐

