Pandas数据fram中异常值的检测与排除

2024-03-29 09:52:04 发布

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

我有一个pandas数据框,只有几列。

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

例如

column 'Vol' has all values around 12xx and one value is 4000 (outlier).

现在我想排除那些有这样的Vol列的行。

所以,本质上我需要在数据框上放置一个过滤器,这样我们就可以选择某一列的值在3个标准差内的所有行。

实现这一目标的优雅方法是什么?


Tags: and数据pandasisvaluecolumnallone
3条回答

对于每个dataframe列,您可以使用:

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)]

如果数据帧中有多个列,并且希望删除至少一列中有异常值的所有行,则以下表达式将一次性完成此操作。

df = pd.DataFrame(np.random.randn(100, 3))

from scipy import stats
df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]

说明:

  • 对于每一列,首先计算 列,相对于列的平均值和标准偏差。
  • 那么is取Z分数的绝对值,因为方向不是 重要的是,只有低于门槛。
  • 所有(轴=1)确保对于每一行,所有列都满足 约束。
  • 最后,使用此条件的结果来索引数据帧。

像在numpy.array中那样使用boolean索引

df = pd.DataFrame({'Data':np.random.normal(size=200)})
# example dataset of normally distributed data. 

df[np.abs(df.Data-df.Data.mean()) <= (3*df.Data.std())]
# keep only the ones that are within +3 to -3 standard deviations in the column 'Data'.

df[~(np.abs(df.Data-df.Data.mean()) > (3*df.Data.std()))]
# or if you prefer the other way around

对于一个系列,它是相似的:

S = pd.Series(np.random.normal(size=200))
S[~((S-S.mean()).abs() > 3*S.std())]

相关问题 更多 >