我有以下资料框:
马匹编号 | 光栅 |
---|---|
25620 | 112 |
25620 | 108 |
25620 | 111 |
25620 | 98 |
25620 | 103 |
25620 | 96 |
我想FGrating
根据这些规则计算列的滚动平均值:
- 如果我有 4 场或更多场比赛
HorseId
,那么我计算最后 4 场比赛的滚动平均值; - 如果我的比赛少于 4 场,那么我会计算到目前为止我参加的比赛的滚动平均值。
平均值应显示在用于计算上述指标的行的下一行。例如:前 4 场比赛的滚动平均值应显示在第 5 行。所以,第一行的正确值为 0
我要找的是这样的表:
马匹编号 | 光栅 | 滚动平均 |
---|---|---|
25620 | 112 | 0 |
25620 | 108 | 112 (112/1) |
25620 | 111 | 110 (112 108)/2 |
25620 | 98 | 110.33 (112 108 111)/3 |
25620 | 103 | 107.25 (112 108 111 98)/4 |
25620 | 96 | 105 (108 111 98 103)/4 |
到目前为止,我得到了过去 4 场比赛的滚动平均值,如下所示:
df.groupby('HorseId')['FGrating'].apply(lambda x: x.shift().expanding(min_periods=no_starts).mean())
但我被其他人困住了。你能帮助我吗?
uj5u.com热心网友回复:
也许尝试使用滚动和移位:
df['Rolling_Average'] = df.groupby('HorseID')['FGrating']/
.shift(1).transform(lambda x: x.rolling(4, 1).mean())
滚动创建一个视窗,可用于计算移动平均值,并移位移动行(因此它不会占用实际行)
HorseID FGrating Rolling_Average
0 25620 112 NaN
1 25620 108 112.000
2 25620 111 110.000
3 25620 98 110.333
4 25620 103 107.250
5 25620 96 105.000
uj5u.com热心网友回复:
使用rolling_mean
:
df['Rolling_Average'] = df.groupby('HorseId')['FGrating'].rolling(4, min_periods=1) \
.mean().shift(fill_value=0).droplevel(0)
print(df)
# Output:
HorseId FGrating Rolling average Rolling_Average
0 25620 112 0 NaN
1 25620 108 112 (112/1) 112.000000
2 25620 111 110 (112 108)/2 110.000000
3 25620 98 110.33 (112 108 111)/3 110.333333
4 25620 103 107.25 (112 108 111 98)/4 107.250000
5 25620 96 105 (108 111 98 103)/4 105.000000
0 评论