我有一个大数据集,其中大部分是数值列和一些对象类型(字符串)列。我试图使用数字列的分位数来删除异常值,但跳过字符串列时遇到了麻烦。我想迭代每一列,检查它是否是一个对象类型,如果不是,计算该列的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
1条答案
按热度按时间pinkon5k1#
让我们考虑以下四列的pandas dataframe (df)-其中三列是数字。
我们可以看到,最后一行显示了a1、a2和a4的明显异常值。
首先,我们可以过滤dataframe,使其只包含数值:
下面是我们的dataframe现在的样子:
使用这个函数,我们可以将NA分配给那些位于四分位数范围之外的值:
然后,可以从 Dataframe 中删除这些NA条目:
现在,我们有一个排除了离群值的数组:
请参阅以下参考资料以获取进一步指导: