Python 如何用数据帧的NaN删除第一行和最后一行,并用下面和上面的值的平均值替换剩余的NaN?

Python 如何用数据帧的NaN删除第一行和最后一行,并用下面和上面的值的平均值替换剩余的NaN?,python,pandas,dataframe,nan,Python,Pandas,Dataframe,Nan,让我们以这个数据帧为例: 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

让我们以这个数据帧为例:

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
我想先删除第一行和最后一行,直到第一行和最后一行中不再有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
   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
然后,我想用最接近的值替换剩余的NaN,下面的值不是NaN,上面的值是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
   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
我知道我可以通过

df.isna()
但我不能解决我的问题。我该怎么办?

我的方法:

# 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
输出:

   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

另一个选项是使用
数据帧。使用
四舍五入插入

nans = df.notna().all(axis=1).cumsum().drop_duplicates()
low, high = nans.idxmin(), nans.idxmax()

df.loc[low+1: high].interpolate().round()

   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

我认为
1.0
3.0
这里只是样本数据,所以
interpolate().round()
一般不会给出平均值。