pandas 过滤包含数值和字符串值的列的大型数据集中的离群值

vc9ivgsu  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个大数据集,其中大部分是数值列和一些对象类型(字符串)列。我试图使用数字列的分位数来删除异常值,但跳过字符串列时遇到了麻烦。我想迭代每一列,检查它是否是一个对象类型,如果不是,计算该列的IQR,找到离群值,删除离群值所在的整行,然后移动到下一列。我尝试了不同的方法,但下面的方法是我提出的最有意义的方法。问题是,它过滤了90%以上的行,我知道这是不正确的,因为我用数字列制作了另一个数据集,过滤了这些,并删除了合理的数量(<10%)。我只是不知道如何实现这一点,并会感谢任何帮助。

def filter_outliers(df):
    numeric_columns = df.select_dtypes(include=[np.number]).columns
    df_filtered = df.copy()
    
    for column in numeric_columns:
        q1 = df[column].quantile(0.25)
        q3 = df[column].quantile(0.75)
        iqr = q3 - q1
        lower_bound = q1 - 1.5 * iqr
        upper_bound = q3 + 1.5 * iqr
        outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
        df_filtered = df_filtered.drop(outliers.index, errors='ignore')
    
    return df_filtered
pinkon5k

pinkon5k1#

让我们考虑以下四列的pandas dataframe (df)-其中三列是数字。

a1      a2      a3     a4
22      51      X      100
78      41      X      52
19      35      X      67
31      15      X      93
29      26      X      47
71      94      X      77
17      52      X      7
74      40      X      32
10023   5454    X      45454

我们可以看到,最后一行显示了a1、a2和a4的明显异常值。
首先,我们可以过滤dataframe,使其只包含数值:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
newdf = df.select_dtypes(include=numerics)
newdf

下面是我们的dataframe现在的样子:

a1      a2      a4
22      51      100
78      41      52
19      35      67
31      15      93
29      26      47
71      94      77
17      52      7
74      40      32
10023   5454    45454

使用这个函数,我们可以将NA分配给那些位于四分位数范围之外的值:

for x in newdf:
    q3,q1 = np.percentile(df.loc[:,x],[75,25])
    iqr = q3-q1
 
    max = q3+1.5*iqr
    min = q1-1.5*iqr
 
    newdf.loc[newdf[x] < min,x] = np.nan
    newdf.loc[newdf[x] > max,x] = np.nan

然后,可以从 Dataframe 中删除这些NA条目:

newdf.dropna(axis='rows')

现在,我们有一个排除了离群值的数组:

a1      a2      a4
22.0    51.0    100.0
78.0    41.0    52.0
19.0    35.0    67.0
31.0    15.0    93.0
29.0    26.0    47.0
17.0    52.0    7.0
74.0    40.0    32.0

请参阅以下参考资料以获取进一步指导:

相关问题