Pandas - прямое добавление столбцов скользящего среднего из группы по в фрейм данных

У меня есть фреймворк со следующими столбцами:

name, date, day_index, value

Я хочу добавить 4-й столбец в тот же фрейм данных, который представляет собой экспоненциально взвешенное скользящее среднее 3-го столбца (значения) для каждого имени, отсортированного по первой дате, а затем по day_index. Я могу сгенерировать это как серию, используя следующий код.

df.sort_values(['date','day_index'],inplace=True)

ecw_series = df.groupby('name').apply(lambda x: 
x["value"].ewm(halflife=2).mean())

Однако, если я попытаюсь напрямую добавить это в исходный фрейм данных, я получу следующую ошибку:

df['ecw'] =  df.groupby('name').apply(lambda x: 
x["value"].ewm(halflife=2).mean())



incompatible index of inserted column with frame index

И если я попытаюсь объединить серию с фреймом данных, я получу следующую ошибку:

df['index'] = df.index

df = df.merge(ecw_series, left_on=['name','index'],right_index=True)

can not merge DataFrame with instance of type <class 
'pandas.core.series.Series'

На этом этапе я рассматривал преобразование серии в фрейм данных, а затем слияние. Но я уверен, что должен быть способ получше.


person oli5679    schedule 16.09.2018    source источник


Ответы (1)


Работает следующий подход:

df['ecw'] = model_df.groupby('name')['value'].apply(lambda x: 
 x.ewm(halflife=2).mean())

Меня все еще немного смущает, почему вы не можете ссылаться на столбец «значение» в лямбда-функции.

person oli5679    schedule 16.09.2018
comment
Если вы ссылаетесь по столбцу, вы должны указать axis = 1: ecw_series = df.groupby('name').apply(lambda x: x["value"].ewm(halflife=2).mean(), axis=1) - person flT; 10.09.2020