如何在Python中删除离群值?

ycl3bljg  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(316)

我想从数据集"train"中删除离群值,为此我决定使用z得分或IQR。
我正在运行Jupyter笔记本上的Microsoft Python客户端的SQL服务器。
我尝试过z得分:

from scipy import stats
train[(np.abs(stats.zscore(train)) < 3).all(axis=1)]

对于IQR:

Q1 = train.quantile(0.02)
Q3 = train.quantile(0.98)
IQR = Q3 - Q1
train = train[~((train < (Q1 - 1.5 * IQR)) |(train > (Q3 + 1.5 * 
IQR))).any(axis=1)]

...它返回...
对于z得分:
TypeError:不支持/的操作数类型:"字符串"和"整数"
对于IQR:
TypeError:无法排序的类型:字符串()
我的火车数据集如下所示:

# Number of each type of column
print('Training data shape: ', train.shape)
train.dtypes.value_counts()

定型数据形状:(300000,111)整数32 66浮点数64 30对象15数据类型:整数64
我们会很感激的。

6qqygrtg

6qqygrtg1#

您的代码遇到了问题,因为您试图计算分类列上的zscore
为了避免这种情况,您应该首先将序列分成具有数字和分类特征的部分:

num_train = train.select_dtypes(include=["number"])
cat_train = train.select_dtypes(exclude=["number"])

并且只有在计算出行索引之后才保留:

idx = np.all(stats.zscore(num_train) < 3, axis=1)

最后把这两部分加在一起

train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

对于IQR部件:

Q1 = num_train.quantile(0.02)
Q3 = num_train.quantile(0.98)
IQR = Q3 - Q1
idx = ~((num_train < (Q1 - 1.5 * IQR)) | (num_train > (Q3 + 1.5 * IQR))).any(axis=1)
train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

如果您有任何其他问题,请告知我们。
PS
此外,您还可以考虑使用pandas.DataFrame.clip处理离群值的另一种方法,它将逐个删除离群值,而不是完全删除一行。

ecfdbz9o

ecfdbz9o2#

您可以使用自动优化器模块。
pip安装自动优化程序
从自动优化器。流程导入outlier_removal

相关问题