0

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

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列中,Roll No 1001 的值是5952005 年、NaN2006 年、5972007 年和NaN2008 年的值。我希望将 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 文档中也为 pandasffil()函数提到了几个解决方案,但没有太大帮助。有什么想法可以实现吗?

4

1 回答 1

1

Groupby,我认为 ffill 应该这样做。

df[['Total_Marks','Previous_Marks']]=df.groupby('Roll_No')[['Total_Marks','Previous_Marks']].fillna(method='ffill')
于 2021-06-18T07:55:19.680 回答