基于多列分组的熊猫滚动平均值

RS

我有一个长格式的数据帧,在两列中有重复的值,在另一列中有数据。我想为每个组查找SMA。我的问题是:rolling()只是忽略了数据按两列分组的事实。

这是一些伪数据和代码。

import numpy as np
import pandas as pd

dtix=pd.Series(pd.date_range(start='1/1/2019', periods=4) )
df=pd.DataFrame({'ix1':np.repeat([0,1],4), 'ix2':pd.concat([dtix,dtix]), 'data':np.arange(0,8) })
df

ix1 ix2数据
0 0 2019-01-01 0 
1 0 2019-01-02 1 
2 0 2019-01-03 2 
3 0 2019-01-04 3 
0 1 2019-01-01 4 
1 1 2019-01-02 5 
2 1 2019-01-03 6 
3 1 2019-01-04 7

现在,当我对这些数据执行分组的滚动均值时,得到的输出如下:

df.groupby(['ix1','ix2']).agg({'data':'mean'}).rolling(2).mean()
        数据
ix1 ix2 
0 2019-01-01 NaN 
    2019-01-02 0.5 
    2019-01-03 1.5 
    2019-01-04 2.5 
1 2019-01-01 3.5 
    2019-01-02 4.5 
    2019-01-03 5.5 
    2019-01 -04 6.5

所需的输出:而我实际上想要的是:


sma 
ix1 ix2 
0 2019-01-01 NaN 
    2019-01-02 0.5 
    2019-01-03 1.5 
    2019-01-04 2.5 
1 2019-01-01 NaN 
    2019-01-02 4.5 
    2019-01-03 5.5 
    2019-01 -04 6.5

感谢您的帮助。

耶斯列尔

将另一个groupby按(fast ix1)使用rolling

df1 = (df.groupby(['ix1','ix2'])
         .agg({'data':'mean'})
         .groupby(level=0, group_keys=False)
         .rolling(2)
         .mean())
print (df1)
                data
ix1 ix2             
0   2019-01-01   NaN
    2019-01-02   0.5
    2019-01-03   1.5
    2019-01-04   2.5
1   2019-01-01   NaN
    2019-01-02   4.5
    2019-01-03   5.5
    2019-01-04   6.5

在您的解决方案中,事后聚合返回一列DataFrame,因此链式rolling处理所有行,而不是像需要的每个组:

print(df.groupby(['ix1','ix2']).agg({'data':'mean'}))
                data
ix1 ix2             
0   2019-01-01     0
    2019-01-02     1
    2019-01-03     2
    2019-01-04     3
1   2019-01-01     4
    2019-01-02     5
    2019-01-03     6
    2019-01-04     7

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章