我正在尝试计算分组后值的滚动平均值。 我的数据集看起来像
import pandas as pd
df = pd.DataFrame({'day': ['2020-01-01', '2020-01-01', '2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-02', '2020-01-03', '2020-01-03', '2020-01-03','2020-01-03'],
'weather': ['rain', 'sun', 'rain', 'sun', 'rain', 'sun', 'rain', 'sun', 'rain', 'sun', 'rain', 'sun'],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]})
现在,我想要每天和每种天气的滚动平均值。
同时
>>>> df.groupby(['day', 'weather']).value.mean()
day weather
2020-01-01 rain 2
sun 3
2020-01-02 rain 6
sun 7
2020-01-03 rain 10
sun 11
正确计算平均值,它的滚动版本,似乎不起作用?
>>>> df.groupby(['day', 'weather']).value.rolling(2).mean()
day weather
2020-01-01 rain 0 NaN
2 2.0
sun 1 NaN
3 3.0
2020-01-02 rain 4 NaN
6 6.0
sun 5 NaN
7 7.0
2020-01-03 rain 8 NaN
10 10.0
sun 9 NaN
11 11.0
正确的做法是什么?
我期望输出是多天的平均值,即(忽略索引)
day weather
2020-01-01 rain 2 2.0
sun 3 3.0
2020-01-02 rain 6 4.0
sun 5 5.0
2020-01-03 rain 8 8.0
sun 9 9.0
我认为您指的是
NaN
值?您的窗口设置为 2
,因此每组的第一个值将设置为 NaN
,因为 min_periods
。这是文档的引用:
对于由整数指定的窗口,min_periods 将默认 到窗口的大小。
df.groupby(['day', 'weather']).value.rolling(2,min_periods=1).mean()
day weather
2020-01-01 rain 0 1.0
2 2.0
sun 1 2.0
3 3.0
2020-01-02 rain 4 5.0
6 6.0
sun 5 6.0
7 7.0
2020-01-03 rain 8 9.0
10 10.0
sun 9 10.0
11 11.0
这是您正在寻找的吗?
更新
您想要每天和天气的平均值,而不是计算平均值的 x 天的滚动平均值(如果我理解正确的话)。 试试这个:
out = df.groupby(['day','weather',],as_index=False)['value'].mean()
print(out)
day weather value
0 2020-01-01 rain 2.0
1 2020-01-01 sun 3.0
2 2020-01-02 rain 6.0
3 2020-01-02 sun 7.0
4 2020-01-03 rain 10.0
5 2020-01-03 sun 11.0
使用每日平均值,您可以计算滚动窗口:
out['rolling_mean'] = out.groupby('weather', as_index=False)['value'].rolling(2,min_periods=1).mean()['value']
print(out)
day weather value rolling_mean
0 2020-01-01 rain 2.0 2.0
1 2020-01-01 sun 3.0 3.0
2 2020-01-02 rain 6.0 4.0
3 2020-01-02 sun 7.0 5.0
4 2020-01-03 rain 10.0 8.0
5 2020-01-03 sun 11.0 9.0