pandas - 将缺失值和异常值估算为中值,从中值计算中排除异常值
问题描述
估算缺失值和极值的中值,从中值的计算中排除那些极值。
我想使用中位数进行估算。我想计算不包括极值的中位数。然后我想将这些极端值归为中值。
我有一个这样的数据框:
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
为异常值,因此将其排除。
我们首先将异常值计算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 估算值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)
推荐阅读
- php - 对于下表[附图],我可以很容易地得到每个人的应有剩余吗?
- php - 在 WooCommerce 单一产品元下添加自定义链接文本,在共享按钮上方
- android - 未从 firebase (android) 获取 OTP(正在测试电话号码)
- python - Python:按值的排序顺序打印键和值
- clang - 如何调用clangd来格式化文件
- akka - Akka Cluster Sharding - 集群内的不同实体可以相互通信吗?
- flutter - 如何阻止模糊滤镜对模糊图像周围的颜色进行采样?
- flutter - 在 Dart Flutter 中将 Unix/epoch 时间戳转换为人类可读的时间
- xml - Prometheus 导出器将 xml 输出转换为名称-值对
- xtext - Xtext 到 Acceleo