2016-08-21 20 views
0

我在Python笔记本中有三列数据集。 IQR的1.5倍似乎有太多的异常值。我认为我怎样才能算出所有列的异常值?如何计算Python中所有列的异常值?

如果有太多的异常值,我可能会考虑删除被认为是多个异常值的点。如果是这样,我该如何计算它呢?

谢谢!

enter image description here

+1

作为起点来看看:http://stackoverflow.com/questions/34782063/how-to-use-pandas-filter-with-iqr – albert

回答

5

类似Romain X.'s answer,但操作上的数据帧,而不是系列。

随机数据:

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 

四分位数的计算:

Q1 = df.quantile(0.25) 
Q3 = df.quantile(0.75) 
IQR = Q3 - Q1 

这些都是每一列的数字:

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

在符合seaborn的计算:

enter image description here

请注意,总和((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 
+0

感谢阿伊汗!太棒了! 如果我只需要计算B列和D列中有多少个异常值,该怎么办?我在下面尝试,但不起作用。分位数(0.25) Q3 = df [“B”,“D”]。分位数(0.75) IQR = Q3 - Q1 ''' ' –

+0

@ChenLi您需要使用一组额外的括号,例如'Q1 = df [[“B”,“D”]]。quantile(0.25)' – ayhan

+0

非常感谢Ayhan!这有很大帮助! –

相关问题