在pandas DataFrame中检测并排除异常值

17 浏览
0 Comments

在pandas DataFrame中检测并排除异常值

我有一个带有几列的熊猫数据框。

现在我知道,某些行的异常值基于某列值。

例如

列“Vol”具有所有值大约为12xx,而其中一个值为4000(异常值)。

现在我想排除具有此类Vol列的行。

因此,本质上,我需要过滤数据框,以选择所有某列的值从平均值开始,例如,距离平均值的3个标准偏差以内的行。

有什么简洁的方法可以实现这一点吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

对于您的每个数据帧列,您可以使用以下方式获取分位数:

q = df["col"].quantile(0.99)

然后使用以下方式进行过滤:

df[df["col"] < q]

如果需要去除下限和上限的离群值,则可以使用 AND 语句组合条件:

q_low = df["col"].quantile(0.01)
q_hi  = df["col"].quantile(0.99)
df_filtered = df[(df["col"] < q_hi) & (df["col"] > q_low)]

0
0 Comments

删除至少有一个异常值的行

如果你的数据框包含多列,且想要删除至少有一个列存在异常值的行,可以使用下面的表达式一次性完成操作:

import pandas as pd
import numpy as np
from scipy import stats
df = pd.DataFrame(np.random.randn(100, 3))
df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]

描述:

  • 对于每一列,首先计算每一个值相对于该列的均值和标准差的Z值。
  • 接着取绝对值的Z值,因为方向不重要,只要它低于阈值。
  • all(axis=1) 确保对于每一行,所有列都满足条件。
  • 最后,将此条件的结果用来索引数据框。

根据单个列过滤其他列

  • 指定用于计算zscore的列,例如 df[0],并去掉 .all(axis=1)

df[(np.abs(stats.zscore(df[0])) < 3)]

0