前向填充参考 ID 列

Forward Fill with Reference to ID column

假设我有一个数据框如下:

Roll No  |  Name  |  School  |  Year  |  Total Marks  |  Previous Marks
------------------------------------------------------------------------
1001     |  abc   |   iisr   |  2005  |      595      |      NaN
1002     |  amr   |   iisd   |  2005  |      599      |      NaN
1001     |  abc   |   iisr   |  2006  |      NaN      |      580
1003     |  def   |   hmms   |  2005  |      600      |      575
1002     |  amr   |   iisd   |  2006  |      NaN      |      590
1004     |  ghi   |  aaiisr  |  2005  |      580      |      NaN
1005     |  jkl   |   ups    |  2005  |      599      |      500
1001     |  abc   |   iisr   |  2007  |      597      |      NaN
1002     |  amr   |   iisd   |  2007  |      600      |      NaN
1005     |  jkl   |   ups    |  2006  |      NaN      |      503
1006     |  mno   |   iisr   |  2005  |      NaN      |      480
1001     |  abc   |   iisr   |  2008  |      NaN      |      575
1007     |  pqr   |   kms    |  2005  |      NaN      |      575
1002     |  amr   |   iisd   |  2008  |      NaN      |      499

我想前向填充 Total MarksPrevious Marks 列,这样对于特定的 Roll No,空值将替换为它们之前出现的值。

例如,在Total Marks列中,1001号卷在2005年的值为595,2006年为NaN,2007年为597,和 2008 年的 NaN。我希望将 2006 年 1001 的空值替换为其先前填充的分数(即 2005 年的分数),并将 2007 年的空值替换为2008年的score值。如果没有找到之前的值,则将其设置为NaNPrevious Marks 列应用相同的逻辑。

我按照上述格式前向填充后的最终数据帧应如下所示:

Roll No  |  Name  |  School  |  Year  |  Total Marks  |  Previous Marks
------------------------------------------------------------------------
1001     |  abc   |   iisr   |  2005  |      595      |      NaN
1002     |  amr   |   iisd   |  2005  |      599      |      NaN
1001     |  abc   |   iisr   |  2006  |      595      |      580
1003     |  def   |   hmms   |  2005  |      600      |      575
1002     |  amr   |   iisd   |  2006  |      599      |      590
1004     |  ghi   |  aaiisr  |  2005  |      580      |      NaN
1005     |  jkl   |   ups    |  2005  |      599      |      500
1001     |  abc   |   iisr   |  2007  |      597      |      580
1002     |  amr   |   iisd   |  2007  |      600      |      590
1005     |  jkl   |   ups    |  2006  |      599      |      503
1006     |  mno   |   iisr   |  2005  |      NaN      |      480
1001     |  abc   |   iisr   |  2008  |      597      |      575
1007     |  pqr   |   kms    |  2005  |      NaN      |      575
1002     |  amr   |   iisd   |  2008  |      600      |      499

我在 Whosebug、GeeksForGeeks 和 pandas 文档中也提到了 pandas ffil() 函数的几个解决方案,但没有太大帮助。有什么想法可以实现吗?

Groupby,ffill我觉得应该可以。

df[['Total_Marks','Previous_Marks']]=df.groupby('Roll_No')[['Total_Marks','Previous_Marks']].fillna(method='ffill')