熊猫数据框按多年滚动统计分组

时间:2019-08-14 15:23:35

标签: python pandas windowing

我有一个pandas数据框,正在尝试按列分组后计算扩展的窗口聚合。数据结构是这样的:

df = pd.DataFrame([['A',1,2015,4],['A',1,2016,5],['A',1,2017,6],['B',1,2015,10],['B',1,2016,11],['B',1,2017,12],
               ['A',1,2015,24],['A',1,2016,25],['A',1,2017,26],['B',1,2015,30],['B',1,2016,31],['B',1,2017,32],
              ['A',2,2015,4],['A',2,2016,5],['A',2,2017,6],['B',2,2015,10],['B',2,2016,11],['B',2,2017,12]],columns=['Typ','ID','Year','dat'])\
.sort_values(by=['Typ','ID','Year'])

    Typ ID  Year    dat
0   A   1   2015    4
6   A   1   2015    24
1   A   1   2016    5
7   A   1   2016    25
2   A   1   2017    6
8   A   1   2017    26
12  A   2   2015    4
13  A   2   2016    5
14  A   2   2017    6
3   B   1   2015    10
9   B   1   2015    30
4   B   1   2016    11
10  B   1   2016    31
5   B   1   2017    12
11  B   1   2017    32
15  B   2   2015    10
16  B   2   2016    11
17  B   2   2017    12

通常,每个Type-ID的年数和每个Type-ID-Year的行数完全不同。我需要将此数据帧按列TypeID进行分组,然后通过Year计算所有观察值的扩展窗口中位数和标准差。我想要这样的输出结果:

    Typ ID  Year    median  std
0   A   1   2015    14.0    14.14
1   A   1   2016    14.5    11.56
2   A   1   2017    15.0    10.99
3   A   2   2015    4.0     0
4   A   2   2016    4.5     0
5   A   2   2017    5.0     0
6   B   1   2015    20.0    14.14
7   B   1   2016    20.5    11.56
8   B   1   2017    21.0    10.99
9   B   2   2015    10.0    0
10  B   2   2016    10.5    0
11  B   2   2017    11.0    0

因此,我想要类似groupby的{​​{1}},其中每个['Type','ID','Year']的中位数和标准差是为所有具有相同Type-ID-Year的数据计算出来的,并且包括Type-ID

没有人工迭代怎么办?

1 个答案:

答案 0 :(得分:0)

这个问题上没有任何活动,所以我将发布找到的解决方案。

mn = df.groupby(by=['Typ','ID']).dat.expanding().median().reset_index().set_index('level_2')
mylast = lambda x: x.iloc[-1]
mn = mn.join(df['Year'])
mn = mn.groupby(by=['Typ','ID','Year']).agg(mylast).reset_index()

我的解决方案遵循以下算法:

  1. 对数据进行分组,计算加窗的中值,然后取回原始索引
  2. 返回原始索引,从原始数据框中获取年份
  3. 按分组列分组,取每个列的最后(顺序)值

这将提供所需的输出。标准偏差(或所需的任何其他统计数据)可以遵循相同的过程。