表中列的异常值公式

2024-05-26 16:26:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df中数字列的示例,其中有10个其他列(数字列和分类列):

Units
-12
4
4
5
1
5
12
6
34
6
7
12
745

我想应用以下公式:

Low outlier: q1-(1.5*iqr)
High outlier: q3+(1.5*iqr)

我知道在{}:{}中有{},使用{}我可以计算{}(第一个四分位数)和{}(第三个四分位数),如下所示:

from scipy.stats import iqr
import numpy as np

q1=np.percentile(df.Units, 25)
q3=np.percentile(df.Units, 75)

mask = df['Units'].between(q1, q3, inclusive=True)
iqr = df.loc[mask, 'Units']

但是,计算上述公式时缺少两个步骤:

  • handleNaN值:我不希望将它们从我的列中删除,而只是将它们从计算中排除
  • 正确应用公式

低异常值:q1-(1.5*iqr)

高异常值:q3+(1.5*iqr)

我想说,也许可以使用between或只是过滤低于/高于上述公式计算值的值


Tags: import示例dfnpmask数字between公式
1条回答
网友
1楼 · 发布于 2024-05-26 16:26:35

df.query的延迟尝试,将NaN从计算中排除,并将其保留在最终查询中:

from scipy.stats import iqr

df = pd.DataFrame([-12,4,4,5,1,5,12,6,34,6,7,np.nan, 12,745], columns=["Units"])

q1 = np.nanpercentile(df.Units, 25)
q3 = np.nanpercentile(df.Units, 75)
IQR = iqr(df.Units, nan_policy="omit")

df.query("Units.isnull() or ((@q1 - 1.5*@IQR) <= Units <= (@q3 + 1.5*@IQR))")

这给出了(希望的)预期结果:

    Units
1     4.0
2     4.0
3     5.0
4     1.0
5     5.0
6    12.0
7     6.0
9     6.0
10    7.0
11    NaN
12   12.0

相关问题 更多 >

    热门问题