我如何摆脱 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
如果我想删除 -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