在Pandas中用前后两行的平均值替换给定的列'异常值'。[英] Replace given columns' outliers with mean of before and after rows' values in Pandas

本文是小编为大家收集整理的关于在Pandas中用前后两行的平均值替换给定的列'异常值'。的处理方法,想解了在Pandas中用前后两行的平均值替换给定的列'异常值'。的问题怎么解决?在Pandas中用前后两行的平均值替换给定的列'异常值'。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

如何将以下数据框中的 score 列中的异常值替换为之前和之后的值?

       date      score
0   2018-07  51.964556
1   2018-08  63.497871
2   2018-09  85.304209
3   2018-10   8.590178   ---> outlier
4   2018-11  54.376001
5   2018-12  65.844745
6   2019-01  53.050123
7   2019-02  39.915868
8   2019-04   3.051802   ---> outlier
9   2019-05  57.487205
10  2019-06  95.101470
11  2019-07  79.879340
12  2019-08  77.007162
13  2019-09  54.567136
14  2019-10  63.899944

预期的输出是:

       date      score
0   2018-07  51.964556
1   2018-08  63.497871
2   2018-09  85.304209
3   2018-10  69.840105
4   2018-11  54.376001
5   2018-12  65.844745
6   2019-01  53.050123
7   2019-02  39.915868
8   2019-04  48.701537
9   2019-05  57.487205
10  2019-06  95.101470
11  2019-07  79.879340
12  2019-08  77.007162
13  2019-09  54.567136
14  2019-10  63.899944

非常感谢.

推荐答案

zscore的解决方案,只将常用的3值改为1.5:

from scipy import stats
mask = (np.abs(stats.zscore(df['score'])) > 1.5)
df.score = df.score.mask(mask).interpolate()
print (df)
       date      score
0   2018-07  51.964556
1   2018-08  63.497871
2   2018-09  85.304209
3   2018-10  69.840105
4   2018-11  54.376001
5   2018-12  65.844745
6   2019-01  53.050123
7   2019-02  39.915868
8   2019-04  48.701537
9   2019-05  57.487205
10  2019-06  68.683273
11  2019-07  79.879340
12  2019-08  77.007162
13  2019-09  54.567136
14  2019-10  63.899944

本文地址:https://www.itbaoku.cn/post/1727788.html