使用 Z - Score 方法删除 pandas 数据框中具有异常值的行

问题描述 投票:0回答:1

我正在使用此代码来删除异常值。

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[0])) < 1.5]

这有效。我们可以看到数据框的行数减少了。但是,我需要删除类似数据帧的百分比变化值中的异常值。

df = df.pct_change()
df.plot.line(subplots=True)

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

这会产生一个空数据框。我究竟做错了什么?值 1.5 是否应该调整? 我尝试了几个值。没有任何效果。

python pandas outliers z-score
1个回答
0
投票

这是因为数据帧的第一个值是空的。所以使用

fillna
来删除 nan 值。

import pandas as pd
import numpy as np

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

df = df.pct_change()
out = df[np.abs(stats.zscore(df[0].fillna(0))) < 1.5]

输出:

>>> out
           0         1         2
0        NaN       NaN       NaN
1   2.066210  0.693520 -1.361496
2   0.036889 -4.277487  1.005127
3  -0.656436 -1.603853 -0.007976
4  -0.554036  3.128630  2.703688
..       ...       ...       ...
95 -2.230812 -0.877377 -0.724188
96 -1.143944  3.102508 -1.353759
97 -2.754503 -0.053533 -5.082226
98 -1.724168  0.175689  0.058848
99 -0.139254 -2.173114 -0.300101

[92 rows x 3 columns]  # <- 8 rows was removed
© www.soinside.com 2019 - 2024. All rights reserved.