Pandas 计算追星族后的滚动平均值
Pandas compute rollling average after groupie
我正在尝试计算分组依据后值的滚动均值。
我的数据集看起来像
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
值?您的 window 设置为 2
,因此每个组的第一个值将设置为 NaN
,因为 min_periods
。这是 documentation 的引用:
For a window that is specified by an integer, min_periods will default
to the size of the window.
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
根据每日平均值,您可以计算滚动 window:
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
我正在尝试计算分组依据后值的滚动均值。 我的数据集看起来像
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
值?您的 window 设置为 2
,因此每个组的第一个值将设置为 NaN
,因为 min_periods
。这是 documentation 的引用:
For a window that is specified by an integer, min_periods will default to the size of the window.
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
根据每日平均值,您可以计算滚动 window:
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