Python Pandas:计算组内的移动平均值

时间:2018-11-16 13:40:48

标签: python pandas pandas-groupby moving-average

我有一个数据帧,其中包含100个对象的时间序列:

object  period  value 
1       1       24
1       2       67
...
1       1000    56
2       1       59
2       2       46
...
2       1000    64
3       1       54
...
100     1       451
100     2       153
...
100     1000    21

我想使用value列的窗口10计算移动平均值。我想我必须做类似的事情

df.groupby('object').apply(lambda ~calculate MA~) 

然后按对象将此系列合并到原始数据帧?无法找出确切的命令

6 个答案:

答案 0 :(得分:3)

您可以将rollingtransform一起使用:

df['moving'] = df.groupby('object')['value'].transform(lambda x: x.rolling(10, 1).mean())

1中的rolling用于最小周期数。

答案 1 :(得分:2)

如果您在多列上分组,则提供的答案可能不会产生预期的结果。

以下应将其剪切:

df['moving'] = df.groupby(['col_1', 'col_2', 'col_3']).rolling(10)['value'].mean().droplevel(level=[0,1,2])

答案 2 :(得分:1)

您可以将groupby对象上的rolling直接用作:

df['moving'] = df.groupby('object').rolling(10)['value'].mean()

答案 3 :(得分:1)

扩展@Sandeep Kadapa的答案:

df['moving'] = df.groupby('object').rolling(10)['value'].mean().reset_index(drop=True)

使用reset_index的原因是,在df.groupby之后,我们得到了一个多级索引,并且在赋值时,我们将得到错误TypeError: incompatible index of inserted column with frame index

答案 4 :(得分:0)

创建一个列作为链接​​方法:

(
    df
        .assign(
            column_name = lambda x: 
                x
                    .groupby(['object'])['value']
                    .transform(lambda x: x.rolling(10)
                    .mean())
        )
)

答案 5 :(得分:0)

这些解决方案假定数据帧以特定方式(按对象和期间)排序。例如,如果数据按面板组织(按时间段和对象),则分配将失败。与排序顺序无关的一种通用解决方案如下:

df.loc[:, 'value_sma_10'] = df.groupby(by='object')[['object', 'period']].rolling(window=10, min_periods=1, on='period').mean().reset_index(level='object')['value']