pandas dataframe,将一列添加为每个组的另一列的移动平均值

时间:2016-08-30 12:28:07

标签: python pandas

我的数据框df如下所示。

dates = pd.date_range('2000-01-01', '2001-01-01')
df1 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'GOLD'})
df2 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'SILVER'})
df = pd.concat([df1, df2])
df = df.sort('date')

          date  market     value
0   2000-01-01    GOLD -1.361360
0   2000-01-01  SILVER  0.255830
1   2000-01-02  SILVER  0.196953
1   2000-01-02    GOLD  1.422454
2   2000-01-03    GOLD -0.827672
...

我希望为每个市场添加另一列作为价值的10d移动平均值。

是否有一个简单的df.groupby('market').???可以实现这一目标?或者我是否必须将工作台转动为宽幅,平滑每根色谱柱,然后再熔化?

2 个答案:

答案 0 :(得分:3)

您可以使用groupby/rolling/mean

result = (df.set_index('date')
            .groupby('market')['value']
            .rolling(10).mean()
            .unstack('market'))

产量

market          GOLD    SILVER
date                          
2000-01-01       NaN       NaN
2000-01-02       NaN       NaN
2000-01-03       NaN       NaN
2000-01-04       NaN       NaN
2000-01-05       NaN       NaN
2000-01-06       NaN       NaN
2000-01-07       NaN       NaN
2000-01-08       NaN       NaN
2000-01-09       NaN       NaN
2000-01-10  0.310077  0.582063
2000-01-11  0.312008  0.752218
2000-01-12  0.151159  0.877230
2000-01-13  0.213611  0.742156
2000-01-14  0.440113  0.614720
2000-01-15  0.551360  0.649967
...

答案 1 :(得分:1)

这是基于@ unutbu的答案,并将结果作为新列添加回原始数据框。

result = df.set_index('date').groupby('market')['value'].rolling(10).mean()

现在如果dfmarket 首先然后date排序,则结果应该是同步的,我们可以只返回值

df.sort_values(['market','date'], inplace = True)
df['value10d_1'] = result.values

但是,如果你像我一样偏执,merge应该让人高枕无忧,

df = pd.merge(df, result.reset_index().rename(columns = {'value':'value10d_2'}), on = ['market','date'])

df['value10d_1'] - df['value10d_2'] # all 0