2017-03-31 77 views
3

我期待在groupby操作中使用pd.rolling_mean。我想在每个组中都有一个滚动平均值的以前的 elemnets在同一组内。这里有一个例子:使用熊猫的groupby进行移位

id val 
0  1 
0  2 
0  3 
1  4 
1  5 
2  6 

分组由id,这应该转化为:

id val 
0  nan 
0  1 
0  1.5 
1  nan 
1  4 
2  nan 

回答

2

我相信你想pd.Series.expanding

df.groupby('id').val.apply(lambda x: x.expanding().mean().shift()) 

0 NaN 
1 1.0 
2 1.5 
3 NaN 
4 4.0 
5 NaN 
Name: val, dtype: float64 
2

我认为你需要groupbyshiftrolling,窗口大小可设置为标:

df['val']=df.groupby('id')['val'].apply(lambda x: x.shift().rolling(2, min_periods=1).mean()) 
print (df) 
    id val 
0 0 NaN 
1 0 1.0 
2 0 1.5 
3 1 NaN 
4 1 4.0 
5 2 NaN 

谢谢3novak的评论 - 你可以设置窗口大小的最大长度组:

f = lambda x: x.shift().rolling(df['id'].value_counts().iloc[0], min_periods=1).mean() 
df['val'] = df.groupby('id')['val'].apply(f) 
print (df) 
    id val 
0 0 NaN 
1 0 1.0 
2 0 1.5 
3 1 NaN 
4 1 4.0 
5 2 NaN 
+2

我觉得OP的问题,可能需要较大的窗口大小。 2对于这个数据集是足够的,但它应该被设置为'df ['id'] .value_counts()。iloc [0]'。 – 3novak