Select计算均值前每组的元素个数

Select the number of elements in each group before calculating the mean

我有一个只有一列的数据框 df。 数据是月度的。 数据类型为浮点型。 索引是 'start of month' 格式的日期。 样本数据在这里

np.random.seed(167)
rng = pd.date_range('2000-01-01', periods=200, freq='MS')

df = pd.DataFrame(
    {"x": np.cumsum([np.random.uniform(-0.01, 0.01) for _ in range(200)])
    }, index=rng
)

我可以获得一个包含月平均值的数据框(即十二个值,一年中的每个月一个):

df.groupby(df.index.to_series().dt.month).mean().

但我正在尝试获取过去几年的月平均值,例如过去三年。 我正在尝试这个:

df.groupby(df.index.to_series().dt.month).apply(lambda x: x.iloc[-3:]).mean()

但它 returns 一个值而不是具有十二个值的所需数据框,一年中的每个月一个。

首先按 DataFrame.last and then use month periods by DatetimeIndex.to_period 过滤 months:

df = df.last('3Y')

df = df.groupby(df.index.to_period('m')).mean()

print (df)
                x
2014-01  0.033955
2014-02  0.024319
2014-03  0.021346
2014-04  0.029669
2014-05  0.032332
2014-06  0.029898
2014-07  0.031526
2014-08  0.031103
2014-09  0.035407
2014-10  0.036398
2014-11  0.027093
2014-12  0.027330
2015-01  0.022826
2015-02  0.023622
2015-03  0.023993
2015-04  0.029287
2015-05  0.036700
2015-06  0.037833
2015-07  0.028914
2015-08  0.031578
2015-09  0.025939
2015-10  0.020513
2015-11  0.013072
2015-12  0.006051
2016-01  0.010619
2016-02  0.008403
2016-03  0.017979
2016-04  0.017292
2016-05  0.026308
2016-06  0.032746
2016-07  0.033926
2016-08  0.041456

或者如果日期时间没有问题:

df = df.last('3Y').resample('m').mean()
print (df)
                   x
2014-01-31  0.033955
2014-02-28  0.024319
2014-03-31  0.021346
2014-04-30  0.029669
2014-05-31  0.032332
2014-06-30  0.029898
2014-07-31  0.031526
2014-08-31  0.031103
2014-09-30  0.035407
2014-10-31  0.036398
2014-11-30  0.027093
2014-12-31  0.027330
2015-01-31  0.022826
2015-02-28  0.023622
2015-03-31  0.023993
2015-04-30  0.029287
2015-05-31  0.036700
2015-06-30  0.037833
2015-07-31  0.028914
2015-08-31  0.031578
2015-09-30  0.025939
2015-10-31  0.020513
2015-11-30  0.013072
2015-12-31  0.006051
2016-01-31  0.010619
2016-02-29  0.008403
2016-03-31  0.017979
2016-04-30  0.017292
2016-05-31  0.026308
2016-06-30  0.032746
2016-07-31  0.033926
2016-08-31  0.041456