我有数据集来测量某列中的电压值。 我正在寻找优雅的方法来提取偏离平均值的行。在“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
如果只有一个组,我可以这样做,但如果为多个组执行此操作,我的代码将会变得混乱和冗长。如果有更简单的方法,我会很感激。
感谢,
答案 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