Python panda数据帧中按某列从行中检测异常值
我有一些数据集,可以测量特定列中的电压值。 我正在寻找一种优雅的方法来提取偏离平均值的行。“volt_id”中有两个组,我想让每个组创建自己的平均值/标准,并使用它们来决定哪些行与每个组不同。 例如,我有如下原始数据集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
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已经实现了“大于”。感谢您的回答!在我发布这个问题之后,我也发现了这一点。这也非常有帮助,也更容易理解。谢谢