如何在sampleID中检测异常值

时间:2018-08-08 17:23:55

标签: python pandas pandas-groupby

我的pandas.DataFrame由许多光谱组成,当在SampleId中时,它们应该相似。我想通过计数不在+/- 3*np.std内的点来检测可能的离群值。在下面的示例中,我们可以看到最后一行(有100条)是异常值。

df = pd.DataFrame({'SID':[0  ,   0, 0, 1, 1, 1, 2, 2, 2  ,],
                   'R1': [2.2, 1.9, 2, 3, 3, 3, 4, 4, 4  ,],
                   'R2': [3  , 3  , 3, 4, 4, 4, 5, 5, 5  ,],
                   'R3': [3  , 3  , 3, 4, 4, 4, 5, 5, 100,]})

我正在寻找一种优雅的解决方案,以根据sampleID减去平均值并验证结果是否在限制阈值之内:

df - df.groupby('SID').mean() > df.groupby('SID').std()*3 #That doesn't work !

我可以使用字典和apply方法使其正常工作,但是我敢肯定pandas已有解决方案。

1 个答案:

答案 0 :(得分:0)

首先,获取所有Rn列。

helper_df = df.filter(regex=(r'R\d'))

然后计算每列的均值和标准差

means = helper_df.mean(axis=0)
stds = helper_df.std(axis=0)

那么所有异常值将在True

outliers = (df - means) > 3*stds

所有具有异常值的行将:

outlier_samples = df[outliers.any(axis=1)]

(请注意,上述数据中100实际上不是异常值,因为mean的{​​{1}}是14,而R3是32)