如何用插值替换 pandas df 中的值

How to replace a value in a pandas df with an interpolation

我有一个数据框 df 看起来像那样

print(df)
x     outlier_flag
10    1
NaN   1
30    1
543  -1
50    1

我想用 row['A][i-1]row['A][i+1] 之间的插值替换标记为 outlier_flag==-1 的值,这意味着我想用 40 替换显示的错误值 543。

我能做的是

df['x'] = df.apply(lambda row: np.nan if row['outlier_flag']==-1 else row['x'], axis=1)
df.interpolate(method='polynomial', order=3, inplace=True)

但我不想这样做,因为这也会在 df['x'] 中插入未标记 outlier_flag==-1nan 值(参见第二行) !纯 nan 值,没有标志标记,我想保留为 nan 用于稍后的任务。

那么,有没有办法就地进行插值,即使是 543 这样的值不是 nan

我试过

df['x'] = df.apply(lambda row: row['x'].interpolate(method='polynomial', order=3) if row['outlier_flag']==-1 else row['x'], axis=1)

但是这样会报错,因为只有nan可以插值,而543int。你对我有什么建议吗?发送

使用np.where:

df['x'] =  np.where(df['outlier_flag'] == -1, (df['x'].shift(1) + df['x'].shift(-1))/2, df['x'])
print(df)

      x  outlier_flag
0  10.0             1
1   NaN             1
2  30.0             1
3  40.0            -1
4  50.0             1

这是一种您可以使用 interpolate() 的方法。

您可以先创建一个列表,其中包含离群值标志为 -1 的行的索引,然后使用 loc:

将 x 中的值替换为 np.nan
incl = df.index[df['outlier_flag'] == -1].tolist()
df.loc[df.index.isin(incl), 'x'] = np.nan

>>> df
      x  outlier_flag
0  10.0             1
1   NaN             1
2  30.0             1
3   NaN            -1
4  50.0             1

然后,您可以使用 np.where 检查 x isnull() 以及该特定索引是否在您创建的列表中,并应用您的插值:

df['x']= np.where( (df['x'].isnull()) & (df.index.isin(incl)), df['x'].interpolate(),df['x'])

打印:

      x  outlier_flag
0  10.0             1
1   NaN             1
2  30.0             1
3  40.0            -1
4  50.0             1