Pandas根据滚动平均值分组添加列

时间:2018-01-08 23:54:39

标签: pandas dataframe group-by

我在按日期分组时使用转换成功添加了一个新的求和音量列,如下所示:

 df

 Name   Date        Volume
 --------------------------
 APL    12-01-2017   1102
 BSC    12-01-2017   4500
 CDF    12-02-2017   5455

 df['vol_all_daily'] = df['Volume'].groupby([df['Date']]).transform('sum')

 Name   Date        Volume   vol_all_daily
 ------------------------------------------
 APL    12-01-2017   1102     5602
 BSC    12-01-2017   4500     5602
 CDF    12-02-2017   5455     5455

然而,当我想采用滚动平均值时,它不起作用!

df['vol_all_ma_2']=df['vol_all_daily'].
groupby([df['Date']]).rolling(window=2).mean()

返回一个DataGroupBy,它给出了错误*并且变得太难以放回到df列中。

 df['vol_all_ma_2'] = 
 df['vol_all_daily'].groupby([df['Date']]).transform('mean').
 rolling(window=2).mean()

这只会产生与vol_all_daily列

几乎相同的结果

更新

我不是每个日期只拿一列。上面的代码仍然需要多个日期......相反,我将.first()添加到groupby ..不确定为什么groupby不占用一行每个日期。

1 个答案:

答案 0 :(得分:1)

你所写的内容的行为似乎是正确的(第1部分下面),但也许你想要调用不同的东西(第2部分下面)。

第1部分:为什么你所写的内容表现正确

d = {'Name':['APL', 'BSC', 'CDF'],'Date':pd.DatetimeIndex(['2017-12-01', '2017-12-01', '2017-12-02']),'Volume':[1102,4500,5455]}
df = pd.DataFrame(d)
df['vol_all_daily'] = df['Volume'].groupby([df['Date']]).transform('sum')
print(df)
rolling_vol = df['vol_all_daily'].groupby([df['Date']]).rolling(window=2).mean()
print('')
print(rolling_vol)

我得到了输出:

          Date Name  Volume  vol_all_daily
0 2017-12-01  APL    1102           5602
1 2017-12-01  BSC    4500           5602
2 2017-12-02  CDF    5455           5455

Date         
2017-12-01  0       NaN
            1    5602.0
2017-12-02  2       NaN
Name: vol_all_daily, dtype: float64

要了解此结果rolling_vol为何正确的原因,请注意您首先调用了groupby,而只有之后调用了rolling。这不应该产生适合df的东西。

第2部分:我认为你想要打电话(只是滚动平均值)

如果您改为运行:

# same as above but without groupby
rolling_vol2 = df['vol_all_daily'].rolling(window=2).mean()
print('')
print(rolling_vol2)

你应该得到:

0       NaN
1    5602.0
2    5528.5
Name: vol_all_daily, dtype: float64

看起来更像是你想要的滚动平均值。为了解释这一点,我建议阅读pandas resampling vs rolling的详细信息。