前向填充参考 ID 列

问题描述

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

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,以及NaN 在 2008 年。我希望将 2006 年 1001 的空值替换为其先前填充的分数(即 2005 的分数),并将 2007 年的空值替换为分数值在 2008 年。如果未找到以前的值,则将其设为 NaN。对 PrevIoUs 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

我在 StackOverflow、GeeksForGeeks 和 pandas 文档中也为 pandas ffil() 函数引用了几个解决方案,但没有太大帮助。任何想法如何实现?

解决方法

Groupby,我认为应该做。

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