我有一个数据帧,其中包含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~)
然后按对象将此系列合并到原始数据帧?无法找出确切的命令
答案 0 :(得分:3)
您可以将rolling与transform
一起使用:
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']