在熊猫数据帧中通过某些列检测行的异常值

时间:2018-03-19 22:41:24

标签: python pandas numpy

我有数据集来测量某列中的电压值。 我正在寻找优雅的方法来提取偏离平均值的行。在“volt_id”中有几个组,我希望每个组创建自己的mean / std并使用它们来决定哪些行偏离每个组。 例如,我有原始数据集如下。

      time     volt_id     value
 0    14         A         300.00
 1    15         A         310.00
 2    15         B         200.00
 3    16         B         210.00
 4    17         B         300.00
 5    14         C         100.00
 6    16         C         110.00
 7    20         C         200.00

算法运行后,我只保留第4行和第7行,这些行与下面的群组有很大的偏差。

      time     volt_id     value
 4    17         B         300.00
 7    20         C         200.00

如果只有一个组,我可以这样做,但如果为多个组执行此操作,我的代码将会变得混乱和冗长。如果有更简单的方法,我会很感激。

感谢,

3 个答案:

答案 0 :(得分:2)

您可以使用group计算并过滤每个groupby上的zscore

假设您只想要那些与平均值相差1个或更多标准偏差的行,

g = df.groupby('volt_id').value
v = (df.value - g.transform('mean')) / g.transform('std')

df[v.abs().ge(1)]

   time volt_id  value
4    17       B  300.0
7    20       C  200.0

答案 1 :(得分:1)

与@ COLDSPEED的解决方案类似:

In [179]: from scipy.stats import zscore

In [180]: df.loc[df.groupby('volt_id')['value'].transform(zscore) > 1]
Out[180]:
   time volt_id  value
4    17       B  300.0
7    20       C  200.0

答案 2 :(得分:0)

执行此操作的一种方法是使用异常值: http://www.mathwords.com/o/outlier.htm

您需要定义内部四分位数范围以及第一和第三四分位数。然后,您可以在简单比较中过滤数据。

四分位数并不是确定异常值的唯一方法。下面讨论比较标准偏差和四分位数来定位异常值: https://stats.stackexchange.com/questions/175999/determine-outliers-using-iqr-or-standard-deviation