Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python panda数据帧中按某列从行中检测异常值_Python_Pandas_Numpy - Fatal编程技术网

Python panda数据帧中按某列从行中检测异常值

Python panda数据帧中按某列从行中检测异常值,python,pandas,numpy,Python,Pandas,Numpy,我有一些数据集,可以测量特定列中的电压值。 我正在寻找一种优雅的方法来提取偏离平均值的行。“volt_id”中有两个组,我想让每个组创建自己的平均值/标准,并使用它们来决定哪些行与每个组不同。 例如,我有如下原始数据集 time volt_id value 0 14 A 300.00 1 15 A 310.00 2 15 B 200.00 3

我有一些数据集,可以测量特定列中的电压值。 我正在寻找一种优雅的方法来提取偏离平均值的行。“volt_id”中有两个组,我想让每个组创建自己的平均值/标准,并使用它们来决定哪些行与每个组不同。 例如,我有如下原始数据集

      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
      time     volt_id     value
 4    17         B         300.00
 7    20         C         200.00
在算法运行之后,我只保留第4行和第7行,这两行与它们的组有很大的偏差,如下所示

      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
      time     volt_id     value
 4    17         B         300.00
 7    20         C         200.00
我可以这样做,如果只有一个组,但我的代码将是混乱和冗长的,如果这样做的多个组。如果有更简单的方法,我将不胜感激


谢谢,

您可以使用
groupby
对每个
组进行计算和筛选

假设您只需要与平均值有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

一种方法是使用异常值:

您需要定义内部四分位数范围以及第一和第三个四分位数。然后,您可以通过简单的比较筛选数据

然而,四分位数并不是确定异常值的唯一方法。这里有一个比较标准偏差和四分位数的讨论,用于定位异常值:

类似于@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

定义“高度偏离”?这并不能真正回答问题。谢谢!它优雅而简单!我不会这么想。顺便问一下,ge函数在这里做什么?对于大于1的值是否设置为真,类似于下面以不同方式实现的MaxU?@JoohunLee“大于或等于”。MaxU已经实现了“大于”。感谢您的回答!在我发布这个问题之后,我也发现了这一点。这也非常有帮助,也更容易理解。谢谢