使用 IQR 删除异常值不起作用,数据框形状不会改变

问题描述 投票:0回答:1

我有一个数据集,其中有体重和高度,我想使用相同的代码删除两列中的所有异常值,如下所示(我的变量是 float640:

for c in df.columns[0:2]:
    Q1= np.percentile(df[c],25)
    Q3= np.percentile(df[c],75)
    IQR= Q3-Q1
    upper= Q3+ 1.5*IQR
    lower= Q1-1.5*IQR    
    upper_array=np.where(df[c]>=upper)[0]
    lower_array=np.where(df[c]<=lower)[0]
    df[c].drop(index=upper_array,inplace=True)
    df[c].drop(index=lower_array, inplace=True)

初始数据形状为(3000,3),但运行代码后,形状没有改变。但事实上,我的数据中存在异常值 enter image description here enter image description here

我尝试修改掉落方法(由AI建议):

    outlier_indices= np.concatenate((upper_array,lower_array))
    df[c].drop(index=outlier_indices, inplace=True)

    df= df[~upper_array]
    df= df[~lower_array]

但是没有效果。

我的代码有什么问题吗?

python pandas dataframe outliers
1个回答
0
投票

问题是您要从列的“副本”中删除索引。您应该从完整数据框中删除它们: df.drop(index=upper_array,inplace=True)

请注意,这也会删除两列中只有一列具有异常值的行。

© www.soinside.com 2019 - 2024. All rights reserved.