使用熊猫' groupby与转移

时间:2017-03-31 13:13:36

标签: python-3.x pandas dataframe group-by cumsum

我希望在pd.rolling_mean操作中使用groupby。我想在每个组中包含同一组中之前 elemnets的滚动平均值。这是一个例子:

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 个答案:

答案 0 :(得分:3)

我认为您需要groupby shiftrolling,窗口大小可以设置为标量:

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

答案 1 :(得分:3)

我相信你想要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