代码之家  ›  专栏  ›  技术社区  ›  W. Walter

熊猫-根据混合频率数据计算月平均值

  •  2
  • W. Walter  · 技术社区  · 4 年前

    假设我有一个数据集,由每月、每季度和每年平均发生的事件组成:

    multi_index = pd.MultiIndex.from_tuples([("2022-01-01", "2022-12-31"), 
                                      ("2022-01-01", "2022-03-30"), 
                                      ("2022-03-01", "2022-03-30"),
                                      ("2022-04-01", "2022-04-30")])
    
    multi_index.names = ['period_begin', 'period_end']
    
    df = pd.DataFrame(np.random.randint(10, size=4), index=multi_index)
    df
    
                             0
    period_begin period_end   
    2022-01-01   2022-12-31  4
                 2022-03-30  3
    2022-03-01   2022-03-30  5
    2022-04-01   2022-04-30  8
    
    

    我想将每月平均数计算为这些重叠数据的(简单)总和。例如,2022年3月的平均值应等于2022年3月、2022年1月和2022年Y月的观测值之和。对于2022年4月,这是2022年4月和2022年Y月的总和(2022年第2季度没有出现,也没有观察到)。最后,我想要的是:

    month_begin  Monthly_Avg                    
    2022-01-01   7
    2022-02-01   7
    2022-03-01   12
    2022-04-01   15
    ...
    2022-12-01   4
    

    我试过了 pd.Grouper() 但它没有起作用。有人有主意吗?我将不胜感激!

    1 回复  |  直到 4 年前
        1
  •  2
  •   jezrael    4 年前

    使用 date_range 在月值列表理解中,创建DataFrame并聚合 sum :

    L = [(x, v) for (s, e), v in df[0].items() for x in pd.`(s, e, freq='MS')]
    
    df = (pd.DataFrame(L, columns=['month_begin','Data'])
            .groupby('month_begin', as_index=False)['Data']
            .sum())
    print (df)
       month_begin  Data
    0   2022-01-01     7
    1   2022-02-01     7
    2   2022-03-01    12
    3   2022-04-01    12
    4   2022-05-01     4
    5   2022-06-01     4
    6   2022-07-01     4
    7   2022-08-01     4
    8   2022-09-01     4
    9   2022-10-01     4
    10  2022-11-01     4
    11  2022-12-01     4