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
过滤 month
s:
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
我有一个只有一列的数据框 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
过滤 month
s:
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