问题描述
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 Marks
和 PrevIoUs 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')