如何用插值替换 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==-1
的 nan
值(参见第二行) !纯 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
可以插值,而543
是int
。你对我有什么建议吗?发送
使用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
我有一个数据框 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==-1
的 nan
值(参见第二行) !纯 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
可以插值,而543
是int
。你对我有什么建议吗?发送
使用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
:
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