首页 > 解决方案 > 如何用插值替换熊猫df中的值

问题描述

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

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

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

我能做的是

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)

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

那么,有没有办法进行适当的插值,即使是这样的值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)

但这会引发错误,因为 onlynan可以被插值并且543is int。你对我有什么建议吗?Tnx

标签: pythonpandasdataframeinterpolationoutliers

解决方案


这是一种您可以随意使用的方式interpolate()

您可以首先创建一个列表,其中包含在异常值标志中具有 -1 的行的索引,然后将 x 中的值替换为np.nanusing loc

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检查 xisnull()以及该特定索引是否在您创建的列表中,并应用您的插值:

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

推荐阅读