1. Определите индекс наблюдения = 0
как выброс и, следовательно, исключите его.
Сначала мы вычисляем выбросы в df["AAA"]
как отдельные логические массивы (той же длины, что и исходная серия).
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's 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)