如何删除数据帧中 NaN 的第一行和最后一行,并将剩余的 NaN 替换为下方和上方值的平均值?

Ewd*_*lam 5 python nan dataframe pandas

让我们以此数据框作为一个简单的例子:

df = pd.DataFrame(dict(Col1=[np.nan,1,1,2,3,8,7], Col2=[1,1,np.nan,np.nan,3,np.nan,4], Col3=[1,1,np.nan,5,1,1,np.nan]))

   Col1  Col2  Col3
0   NaN   1.0   1.0
1   1.0   1.0   1.0
2   1.0   NaN   NaN
3   2.0   NaN   5.0
4   3.0   3.0   1.0
5   8.0   NaN   1.0
6   7.0   4.0   NaN
Run Code Online (Sandbox Code Playgroud)

我想首先删除第一行和最后一行,直到第一行和最后一行不再有 NaN 为止。

中间预期产出:

   Col1  Col2  Col3
1   1.0   1.0   1.0
2   1.0   NaN   NaN
3   2.0   NaN   5.0
4   3.0   3.0   1.0
Run Code Online (Sandbox Code Playgroud)

然后,我想用下面的不是 NaN 的最接近值和上面的值的平均值替换剩余的 NaN。

最终预期输出:

   Col1  Col2  Col3
0   1.0   1.0   1.0
1   1.0   2.0   3.0
2   2.0   2.0   5.0
3   3.0   3.0   1.0
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过以下方式在数据框中获得 NaN 的位置

df.isna()
Run Code Online (Sandbox Code Playgroud)

但我无法解决我的问题。请问我该怎么办?

Qua*_*ang 4

我的做法:

# identify the rows with some NaN
s = df.notnull().all(1)

# remove those with NaN at beginning and at the end:
new_df = df.loc[s.idxmax():s[::-1].idxmax()]

# average:
new_df = (new_df.ffill()+ new_df.bfill())/2
Run Code Online (Sandbox Code Playgroud)

输出:

   Col1  Col2  Col3
1   1.0   1.0   1.0
2   1.0   2.0   3.0
3   2.0   2.0   5.0
4   3.0   3.0   1.0
Run Code Online (Sandbox Code Playgroud)