我如何摆脱 Pandas 的异常?

How do I get rid of abnormalities from Pandas?

如果我想删除 -2σ 和 2σ 之间不存在的值,如何使用 iqr 删除异常值?

我按如下方式实现了这个等式。

iqr = df['abc'].percentile(0.75) - df['abc'].percentile(0.25)

cond1 = (df['abc'] > df['abc'].percentile(0.75) + 2 * iqr)
cond2 = (df['abc'] < df['abc'].percentile(0.25) - 2 * iqr)

df[cond1 & cond2]

这是正确的方法吗?

这是不对的。您的 iqr 几乎从不等于 σ。四分位数和偏差不是一回事。

幸运的是,您可以使用 Series.std().

轻松计算数值系列的标准差
sigma = df['abc'].std()

cond1 = (df['abc'] > df['abc'].mean() - 2 * sigma)
cond2 = (df['abc'] < df['abc'].mean() + 2 * sigma)

df[cond1 & cond2]

您可以使用 neulab Python 库 (https://pypi.org/project/neulab)

有多种方法可以检测和删除异常值。 例如 Chauvenet 算法:

from neulab.OutlierDetection import Chauvenet

d = {'col1': [8.02, 8.16, 3.97, 8.64, 0.84, 4.46, 0.81, 7.74, 8.78, 9.26, 20.46, 29.87, 10.38, 25.71], 'col2': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
df = pd.DataFrame(data=d)

chvn = Chauvenet(dataframe=df, info=True, autorm=True)

Output: Detected outliers: {'col1': [29.87, 25.71, 20.46, 0.84, 0.81, 3.97, 4.46, 10.38, 7.74, 9.26]}

    col1    col2
0   8.02    1
1   8.16    1
3   8.64    1
8   8.78    1