python - 如何用插值替换熊猫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==-1
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)
但这会引发错误,因为 onlynan
可以被插值并且543
is int
。你对我有什么建议吗?Tnx
解决方案
这是一种您可以随意使用的方式interpolate()
。
您可以首先创建一个列表,其中包含在异常值标志中具有 -1 的行的索引,然后将 x 中的值替换为np.nan
using 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
推荐阅读
- laravel - ErrorException:使用未定义的常量 user_id - 假定为“user_id”
- python-3.x - 值显示为列表时的字典值比较
- android - RecyclerView 在其他位置显示错误数据
- jmeter - 我无法记录下订单活动并对随机生成的 URL 执行负载测试
- c# - 为什么 dataTable.Rows[0]["columnName"] == null。不工作?
- xamarin.forms - 动态添加删除部分视图 Prism
- java - Hibernate用NULL覆盖列值?
- flutter - Flutter 使用拖动和按钮单击扩展 TextField
- typescript - 在打字稿中使用带有currying的文字时如何防止缩小泛型类型?
- jsf - 表单未在第一次点击时提交