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