使用 IQR 作为参数自动从 pandas 数据框中移除异常值并将变量放入列表中

Automating removing outliers from a pandas dataframe using IQR as the parameter and putting the variables in a list

我正在尝试使用 IQR 作为参数自动从 Pandas 数据框中删除异常值并将变量放入列表中。

此代码有效 -(其中 dummy_df 是数据框,'pdays' 是我要删除异常值的第一个变量)。

q1 = np.percentile(dummy_df['pdays'], 25, interpolation = 'midpoint')
 
q3 = np.percentile(dummy_df['pdays'], 75, interpolation = 'midpoint') 

iqr = q3 - q1

upper = np.where(dummy_df['pdays'] >= (q3+1.5*iqr))

lower = np.where(dummy_df['pdays'] <= (q1-1.5*iqr))

dummy_df.drop(upper[0], inplace = True)

dummy_df.drop(lower[0], inplace = True)

print("New Shape: ", dummy_df.shape)

然而,这并不-

remove_outliers = ['pdays','poutcome', 'campaign', 'previous']

for outlier in remove_outliers:

    q1 = np.percentile(dummy_df[outlier], 25, interpolation = 'midpoint')
 
    q3 = np.percentile(dummy_df[outlier], 75, interpolation = 'midpoint') 

    iqr = q3 - q1 

    upper = np.where(dummy_df[outlier] >= (q3+1.5*iqr))

    lower = np.where(dummy_df[outlier] <= (q1-1.5*iqr))

    dummy_df.drop(upper[0], inplace = True)

    dummy_df.drop(lower[0], inplace = True)

print("New Shape: ", dummy_df.shape) 

我得到的错误是不同的数据类型。但为什么?这不是一回事吗?我错过了什么?

我希望能够 运行 一个 For 循环,因为我将在决策树上进行反复试验以获得最佳准确性。不想每次需要删除变量或添加要删除异常值的变量时都编写代码。

我试过将 dummy_df['pdays] 等放在 remove_outliers 列表中,还有 dummy_df.pdays 等......我试过使用 loc 和 iloc -虽然我认为这不适用。不知道下一步该怎么做。重要的是,我需要了解有什么区别——我错过了什么?

实际上,在删除离群值之前,请检查您要删除离群值的特征的数据类型是否为数字(int 或 float)。如果要素类型是对象,则 IQR 将不起作用。 因为 IQR 异常值检测仅适用于数字特征,检查 DataFrame 类型的数据类型:

dummy_df.dtype

如果您要删除异常值的每一列都是 int64 或 float64 类型,则不会出现错误,但如果它是对象类型,则必须将其转换为数字类型。

同样在此之前,请从数据集中删除所有 Nan 值:

dummy_df=dummy_df.dropna()

根据对原始 post 的评论,我建议您执行以下操作并修改您的解决方案。

我相信 可以快速解决您的问题,因此请记得在 post 之前搜索 SO。这将删除其中一个(或多个)所需列值是离群值的所有行。

cols = ['pdays', 'campaign', 'previous'] # The columns you want to search for outliers in

# Calculate quantiles and IQR
Q1 = dummy_df[cols].quantile(0.25) # Same as np.percentile but maps (0,1) and not (0,100)
Q3 = dummy_df[cols].quantile(0.75)
IQR = Q3 - Q1

# Return a boolean array of the rows with (any) non-outlier column values
condition = ~((dummy_df[cols] < (Q1 - 1.5 * IQR)) | (dummy_df[cols] > (Q3 + 1.5 * IQR))).any(axis=1)

# Filter our dataframe based on condition
filtered_df = dummy_df[condition]