我想用中位数来估算。我要计算排除极端的中位数。然后,我想将这些极端值作为中位数。
我有一个这样的数据框:
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
答案 0 :(得分:0)
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
然后为将用于插补的值创建一个新的特征向量。这是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
然后您可以使用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)