1. 查询缺失值位置
isnull=[]
for i in df.columns:
for j in df.index:
if df.isnull().loc[j,i]:
isnull.append((j,i))
isnull
2. 拉格朗日插值
#传入存在缺失值的列,缺失值所在0轴坐标index,按前后k个数来计算拉格朗日插值,返回index的拉格朗日插值
def LagFill(df,i,k):
r=0 if (i-k)<0 else (i-k) #python的三目运算符较为特殊
l=len(df.index) if (i+1+k)>len(df.index) else (i+1+k)
y=df.loc[list(range(r,i))+list(range(i+1,l))] #取index前后k个数据作为y代入拉格朗日函数进行拟合
for j in y.index:
if y.isnull().loc[j]:
y.drop(index=j,inplace=True)
x=y.index
lag=lagrange(x.values,y.values)
return lag(i)
3. 调用自定义插值函数
for i in isnull:
fnum=LagFill(df.loc[:,i[1]],i[0],5)
df.loc[i[0],i[1]]=fnum
这样df的缺失值就全部被插补了!