Как включить скользящее среднее с Pandas на основе значений в других столбцах - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь вычислить Скользящее среднее на следующем фрейме данных, но у меня возникают проблемы с присоединением результата обратно к фрейму данных
Фрейм данных: (значения Скользящего среднего отображаются в скобках)

Key1 Key2 Value MovingAverage  
  1    2    1       (Nan)
  1    7    2       (Nan)
  1    8    3       (Nan)
  2    5    1       (Nan)
  2    3    2       (Nan)
  2    2    3       (Nan)
  3    7    1       (Nan)
  3    5    2       (Nan)
  3    8    3       (Nan)
  4    7    1       (1.33)
  4    2    2        (2)
  4    9    3       (Nan)
  5    8    1       (2.33)
  5    3    2       (Nan)
  5    9    3       (Nan)
  6    2    1        (2)
  6    7    2       (1.33)
  6    9    3        (3)

Код:

import pandas as pd
d = {'Key1':[1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6], 'Key2':[2,7,8,5,3,2,7,5,8,7,2,9,8,3,9,2,7,9],'Value':[1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3]}
df = pd.DataFrame(d)
print(df)
MaDf = df.groupby(['Key2'])['Value'].rolling(window=3).mean().to_frame('mean')
print (MaDf) 

Если вы запустите код, он будет правильно рассчитывать скользящую среднюю на основе «Key2» и «Value», но я не могу найти способ правильно вставить его обратно в исходный кадр данных (df)

Ответы [ 2 ]

3 голосов
/ 16 марта 2020

Удалить первый уровень MultiIndex с помощью Series.reset_index с drop=True для выравнивания по второму уровню:

df['mean'] = (df.groupby('Key2')['Value']
                .rolling(window=3)
                .mean()
                .reset_index(level=0, drop=True))
print (df)
    Key1  Key2  Value      mean
0      1     2      1       NaN
1      1     7      2       NaN
2      1     8      3       NaN
3      2     5      1       NaN
4      2     3      2       NaN
5      2     2      3       NaN
6      3     7      1       NaN
7      3     5      2       NaN
8      3     8      3       NaN
9      4     7      1  1.333333
10     4     2      2  2.000000
11     4     9      3       NaN
12     5     8      1  2.333333
13     5     3      2       NaN
14     5     9      3       NaN
15     6     2      1  2.000000
16     6     7      2  1.333333
17     6     9      3  3.000000

Если по умолчанию RangeIndex возможно, используйте Series.sort_index:

df['mean'] = (df.groupby(['Key2'])['Value']
                .rolling(window=3)
                .mean()
                .sort_index(level=1)
                .values)
print (df)
    Key1  Key2  Value      mean
0      1     2      1       NaN
1      1     7      2       NaN
2      1     8      3       NaN
3      2     5      1       NaN
4      2     3      2       NaN
5      2     2      3       NaN
6      3     7      1       NaN
7      3     5      2       NaN
8      3     8      3       NaN
9      4     7      1  1.333333
10     4     2      2  2.000000
11     4     9      3       NaN
12     5     8      1  2.333333
13     5     3      2       NaN
14     5     9      3       NaN
15     6     2      1  2.000000
16     6     7      2  1.333333
17     6     9      3  3.000000
2 голосов
/ 16 марта 2020

Просто df['mean'] = df.groupby(['Key2'])['Value'].rolling(window=3).mean().values

...