我有以下資料幀:
| 日期 | 追蹤 | 表面 | 光柵 | 馬匹編號 | 沙田最后的FGrating,草 |
|---|---|---|---|---|---|
| 2017-09-03 | 沙田 | 草 | 110 | 1736 | |
| 2017-09-16 | 沙田 | 草 | 124 | 1736 | 110 |
| 2017-10-14 | 沙田 | 草 | 118 | 1736 | 124 |
| 2017-11-11 | 沙田 | 草 | 107 | 1736 | 118 |
| 2018-03-28 | 歡樂谷 | 草 | 117 | 1736 | |
| 2018-04-11 | 歡樂谷 | 草 | 114 | 1736 | |
| 2018-09-22 | 沙田 | 草 | 124 | 1736 | 107 |
如您所見,沙田草場有最后一個 FGrating 的空間。這些空間有兩個原因:
- 沒有最后的FGrating(第一條記錄);
- 這條賽道有最后一個 FGrating,但是當同一匹馬的比賽在另一條賽道(此表中的歡樂谷草地)上時,它沒有被寫入。
到目前為止,根據此代碼,我僅設法完成了填充部分:
def return_mask_and_text_from_tracks(data, track_no, metric):
if track_no == 0: # Sha Tin - grass
mask = (data.Track == 'Sha Tin') & (data.Surface == 'Grass')
text = str(metric) ' at Sha-Tin Grass'
if track_no == 1: # Sha Tin - dirt
mask = (data.Track == 'Sha Tin') & (data.Surface == 'Dirt')
text = str(metric) ' at Sha-Tin Dirt'
if track_no == 2: # Happy Valley - grass
mask = (data.Track == 'Happy Valley') & (data.Surface == 'Grass')
text = str(metric) ' at Happy Valley Grass'
return mask, text
def compute_last_fgrating(data, mask=''):
if len(mask) == 0:
return data.groupby('HorseId')['FGrating'].apply(lambda x: x.shift(1))
else:
return data.loc[mask][['HorseId', 'FGrating']].groupby('HorseId')['FGrating'].apply(lambda x: x.shift(1))
for i in range(3):
mask, text = return_mask_and_text_from_tracks(featured_data, i, 'Last FGrating')
featured_data[text] = compute_last_fgrating(featured_data, mask=mask)
我正在尋找用以下值填充最右邊的列的方法:
- 0,當不存在最后一個 FGrating 時(本例中為第一條記錄)
- 同一匹馬在其他賽道上比賽的記錄中最后一次在沙田草地上的 FGrating。
決賽桌應如下所示:
| 日期 | 追蹤 | 表面 | 光柵 | 馬匹編號 | 沙田最后的FGrating,草 |
|---|---|---|---|---|---|
| 2017-09-03 | 沙田 | 草 | 110 | 1736 | 0(不存在先前的 FGrating) |
| 2017-09-16 | 沙田 | 草 | 124 | 1736 | 110 |
| 2017-10-14 | 沙田 | 草 | 118 | 1736 | 124 |
| 2017-11-11 | 沙田 | 草 | 107 | 1736 | 118 |
| 2018-03-28 | 歡樂谷 | 草 | 117 | 1736 | 118(此時沙田草地上的最后一個FGrating) |
| 2018-04-11 | 歡樂谷 | 草 | 114 | 1736 | 118 |
| 2018-09-22 | 沙田 | 草 | 124 | 1736 | 107 |
我該怎么做?
uj5u.com熱心網友回復:
在這里你只需要
df["Last FGrating at Sha Tin, grass"] = df["Last FGrating at Sha Tin, grass"].fillna(method="ffill").fillna(0)
解釋
第一個fillna用可用的最新值 ( method="ffill")填充 NaN然后你在第一行只留下一個 NaN,你可以用0.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/369418.html
