我有以下資料框:
| 馬匹編號 | 光柵 |
|---|---|
| 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403837.html
標籤:
下一篇:將字串串列轉換為物件
