我的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
已有解决方案。
答案 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)