将缺失值和离群值估算为中值,从中值的计算中排除离群值

时间:2018-06-28 15:55:06

标签: pandas scikit-learn data-cleaning

为缺失值和极值都计算中位数,从中位数的计算中排除那些极值。

我想用中位数来估算。我要计算排除极端的中位数。然后,我想将这些极端值作为中位数。

我有一个这样的数据框:

df = pd.DataFrame({"AAA":[100,NaN,0.0,0.1,4.6]})

   AAA
0  100
1  NaN
2  0.0
3  0.1
4  4.6

我想将观察索引= 0定义为离群值,因此,将其从估算计算中排除,并估算其值。

   AAA  impute
0  100    True
1  NaN    True
2  0.0   False
3  0.1   False
4  4.6   False

然后,我想在新的AAA_列中估算NaN的值

   AAA  impute  AAA_
0  100    True   NaN
1  NaN    True   NaN
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

因此,我想要一个如下数据框:

   AAA  impute  AAA_
0  100    True   0.1
1  NaN    True   0.1
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

1 个答案:

答案 0 :(得分:0)

1.将观察索引= 0定义为异常值,因此将其排除。

我们首先将df["AAA"]中的离群值计算为单独的布尔数组(与原始Series的长度相同)。

outlier = np.where(df["AAA"] >= 100,1,0).astype(bool)
is_null = np.where(df["AAA"].isnull(),1,0).astype(bool)
impute = (outlier | is_null)

这将返回以下结果作为数据框。

df["impute"] = impute

   AAA  impute
0  100    True
1  NaN    True
2  0.0   False
3  0.1   False
4  4.6   False

2。仅使用有效值创建特征向量

然后为将用于插补的值创建一个新的特征向量。这是AAA的子集,具体取决于它是否被标记为离群值或缺失值。

AAA_=np.where(~impute, x.AAA, np.nan)

df["AAA_"] = AAA_

   AAA  impute  AAA_
0  100    True   NaN
1  NaN    True   NaN
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

3。估算值

然后您可以使用scikit-learn的preprocessing.Imputer来估算值。

median_imputer = preprocessing.Imputer(strategy="median", axis=0)
AAA_complete = median_imputer.fit_transform(AAA_.reshape(-1, 1))

这将返回答案:

df["AAA"] = AAA_complete

   AAA  impute  AAA_
0  100    True   0.1
1  NaN    True   0.1
2  0.0   False   0.0
3  0.1   False   0.1
4  4.6   False   4.6

注意:我知道面对极端值,中值很可靠,但是我也希望这些值也能转换。只需更改一行即可轻松将其更改为平均值。 median_imputer = preprocessing.Imputer(strategy="median", axis=0)mean_imputer = preprocessing.Imputer(strategy="mean", axis=0)

相关问题