Среднее значение по категории за последний N раунд в Pandas и отставание от него

У меня следующая проблема. Я хочу вычислить среднее значение последних 2 наблюдений на имя и раунд и отстать от него. См. следующий пример:

df = pd.DataFrame(data = { 'name':["a","a","a","a","b","b","c" ] , 'value':[6,5,4,3,1,2,1] , 
                        'round':[1,2,3,4,1,2,1 ]})

Желаемый результат:

df = pd.DataFrame(data = { 'name':["a","a","a","a","b","b","c" ] , 'value':[6,5,4,3,1,2,1] ,
                        'round':[1,2,3,4,1,2,1 ], 'mean_last_2':["NaN","NaN",5.5,4.5,"NaN","NaN","NaN"]})

Я пробовал это, но получил «AttributeError: объект 'float' не имеет атрибута 'shift'»:

df['mean_last_2'] = df.groupby("name")['value'].apply(lambda x: 
                                                         x.tail(2).mean().shift(1))

Как я могу это исправить, пожалуйста?

0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать что-то вроде этого:

 df['mean_last_2'] = df.groupby('name')['value'].apply(lambda x: x.rolling(2).mean().shift())

Выход:

  name  value  round  mean_last_2
0    a      6      1          NaN
1    a      5      2          NaN
2    a      4      3          5.5
3    a      3      4          4.5
4    b      1      1          NaN
5    b      2      2          NaN
6    c      1      1          NaN

Вы можете сделать что-то вроде

df.groupby("name").apply(lambda d: d.assign(mean_last_2 = d['value'].rolling(2).mean().shift()))

получить

        name    value   round   mean_last_2
name                    
a   0   a       6       1       NaN
    1   a       5       2       NaN
    2   a       4       3       5.5
    3   a       3       4       4.5
b   4   b       1       1       NaN
    5   b       2       2       NaN
c   6   c       1       1       NaN

Другие вопросы по теме