2017-03-31 95 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