簡體   English   中英

如何在 DataFrame 的同一列上復制前一行的值?

[英]How can I copy the value of a previous row, on the same column in a DataFrame?

我有以下 DataFrame:

日期 追蹤 表面 光柵 馬號 沙田最后的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,grass有空間。 這些空間有兩個原因:

  1. 沒有最后的FGrating(第一條記錄);
  2. 這條賽道有一個最后的 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)

我正在尋找用以下值填充最右邊一列的方法:

  1. 0,當不存在最后一個 FGrating 時(在這種情況下是第一條記錄)
  2. 最后一次在沙田草地上的 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(此時最后一次在沙田草地上打草)
2018-04-11 歡樂谷 114 1736 118
2018-09-22 沙田 124 1736 107

我該怎么做?

在這里你只需要

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填充它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM