如何计算Python中所有列的异常值?

Cha*_* Li 2 python pandas

我在Python笔记本中有三列数据集.似乎有超过1.5倍IQR的异常值.我想我怎么能算出所有列的异常值?

如果异常值太多,我可能会考虑删除多个特征作为异常值的点.如果是这样,我怎么能以这种方式计算呢?

谢谢!

在此输入图像描述

ayh*_*han 7

Romain X.的答案类似,但是在DataFrame而不是Series上运行.

随机数据:

np.random.seed(0)
df = pd.DataFrame(np.random.randn(100, 5), columns=list('ABCDE'))
df.iloc[::10] += np.random.randn() * 2  # this hopefully introduces some outliers
df.head()
Out: 
          A         B         C         D         E
0  2.529517  1.165622  1.744203  3.006358  2.633023
1 -0.977278  0.950088 -0.151357 -0.103219  0.410599
2  0.144044  1.454274  0.761038  0.121675  0.443863
3  0.333674  1.494079 -0.205158  0.313068 -0.854096
4 -2.552990  0.653619  0.864436 -0.742165  2.269755
Run Code Online (Sandbox Code Playgroud)

四分位计算:

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
Run Code Online (Sandbox Code Playgroud)

这些是每列的数字:

((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
Out: 
A    1
B    0
C    0
D    1
E    2
dtype: int64
Run Code Online (Sandbox Code Playgroud)

符合seaborn的计算:

在此输入图像描述

请注意,sum((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR)))之前的部分是布尔掩码,因此您可以直接使用它来删除异常值.这会将它们设置为NaN,例如:

mask = (df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))
df[mask] = np.nan
Run Code Online (Sandbox Code Playgroud)