Python从数据中删除异常值

Posted

技术标签:

【中文标题】Python从数据中删除异常值【英文标题】:Python remove outliers from data 【发布时间】:2016-08-20 06:44:45 【问题描述】:

我有一个如下的数据框:

ID Value
A   70
A   80
B   75
C   10
B   50
A   1000
C   60
B   2000
..  ..

我想按 ID 对这些数据进行分组,从分组数据(我们从箱线图中看到的那些)中删除异常值,然后计算平均值。

到目前为止

grouped = df.groupby('ID')

statBefore = pd.DataFrame('mean': grouped['Value'].mean(), 'median': grouped['Value'].median(), 'std' : grouped['Value'].std())

我怎样才能找到异常值,删除它们并获取统计信息。

【问题讨论】:

这本质上是***.com/questions/11686720/…的复制品,已经有了一些答案 Is there a numpy builtin to reject outliers from a list的可能重复 【参考方案1】:

就这样吧:

In [187]: df[df<100].groupby('ID').agg(['mean','median','std'])
Out[187]: 
   Value                  
    mean median        std
ID                        
A   75.0   75.0   7.071068
B   62.5   62.5  17.677670
C   35.0   35.0  35.355339

【讨论】:

谢谢,但我想先删除异常值,然后再进行平均标准计算。我想使用的异常值方法是 Boxplot 计算使用的方法 我不知道这个方法。你有参考吗?【参考方案2】:

我相信您所指的方法是删除 > 1.5 * 四分位距中位数的值。所以首先,计算你的初始统计数据:

statBefore = pd.DataFrame('q1': grouped['Value'].quantile(.25), \
'median': grouped['Value'].median(), 'q3' : grouped['Value'].quantile(.75))

然后判断原始DF中的值是否为异常值:

def is_outlier(row):
    iq_range = statBefore.loc[row.ID]['q3'] - statBefore.loc[row.ID]['q1']
    median = statBefore.loc[row.ID]['median']
    if row.Value > (median + (1.5* iq_range)) or row.Value < (median - (1.5* iq_range)):
        return True
    else:
        return False
#apply the function to the original df:
df.loc[:, 'outlier'] = df.apply(is_outlier, axis = 1)
#filter to only non-outliers:
df_no_outliers = df[~(df.outlier)]

【讨论】:

谢谢山姆,这就是我要找的。你能推荐一个关于熊猫的好教程吗?我是初学者,没有太多经验。干杯! 能否解释一下这部分代码:statBefore.loc[row.ID]['q3'] @user1584253 这个函数返回各个特征的分位数。【参考方案3】:
Q1 = df['Value'].quantile(0.25)
Q3 = df['Value'].quantile(0.75)
IQR = Q3 - Q1

data = df[~((df['Value'] < (Q1 - 1.5 * IQR)) |(df['Value'] > (Q3 + 1.5 * 
IQR))).any(axis=1)]

【讨论】:

以上是关于Python从数据中删除异常值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XY 散点图中删除异常值

如何删除 Python boxplot 图形图像中的异常值?

使用百分位数从熊猫数据框中删除异常值

python删除异常值,过滤并取平均值

如何一次性检测和删除熊猫数据帧每一列的异常值? [复制]

Python异常值删除