Pandas 在追星族之后计算滚动平均值

问题描述 投票:0回答:1

我正在尝试计算分组后值的滚动平均值。 我的数据集看起来像

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
pandas group-by rolling-computation
1个回答
1
投票

我认为您指的是

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

© www.soinside.com 2019 - 2024. All rights reserved.