У меня есть фрейм данных, как показано ниже:
>df
ID Value
---------------
1 1.0
1 2.0
1 3.0
1 4.0
2 6.0
2 7.0
2 8.0
3 2.0
Я хочу вычислить min/max/sum/mean/var
в поле 'значение' последних int(group size /2)
записей каждой группы вместо фиксированного количества записей.
- Для идентификатора = 1 применить
min/max/sum/mean/var
к полю «значение» последних 4/2 = 2 записи - Для идентификатора = 2 применить
min/max/sum/mean/var
к полю «значение» последние 3/2 = 1 запись. - Для идентификатора = 3 примените
min/max/sum/mean/var
к полю 'значение' из последних 1 записей, поскольку в группе имеется только одна запись.
поэтому вывод должен быть
Value
ID min max sum mean var
----------------------------------
1 3.0 4.0 7.0 3.5 0.5 # the last 4/2 rows for group with ID =1
2 7.0 7.0 7.0 7.0 0.5 # the last 3/2 rows for group with ID =2
3 2.0 2.0 2.0 2.0 Nan # the last 1 rows for group with ID =3
Я думаю использовать функцию rolling
, как показано ниже:
df_group=df.groupby('ID')
.apply(lambda x: x \
.sort_values(by=['ID'])
.rolling(window=int(x.size/2),min_periods=1)
.agg({'Value':['min','max','sum','mean','var']})
.tail(1)
)
, но результат получается чтобы быть как ниже
Value
min max sum mean var
ID
------------------------------------------------
1 3 1.0 4.0 10.0 2.5 1.666667
2 6 6.0 8.0 21.0 7.0 1.000000
3 7 2.0 2.0 2.0 2.0 NaN
кажется, что x.size не работает вообще.
Есть ли способ установить размер прокатки в зависимости от размера группы?