python异常值处理四分位法_Python清除异常值四分位法

本文介绍了一种基于IQR(四分位数间距)的异常值检测算法,并通过具体实例展示了如何使用该算法来识别并移除数据集中的异常值。
部署运行你感兴趣的模型镜像

看了https://blog.youkuaiyun.com/zhuiqiuuuu/article/details/82721935 这篇文章,但是因为用不到pd,所以改了改。

先上代码

# Outlier detection

import numpy as np

def detect_outliers2(df):

outlier_indices = []

# 1st quartile (25%)

Q1 = np.percentile(df, 25)

# 3rd quartile (75%)

Q3 = np.percentile(df, 75)

# Interquartile range (IQR)

IQR = Q3 - Q1

# outlier step

outlier_step = 1.5 * IQR

for nu in df:

if (nu < Q1 - outlier_step) | (nu > Q3 + outlier_step):

df.remove(nu)

return df

if __name__ == '__main__':

df = [-3331,2,3,4,11111]

Outliers_to_drop = detect_outliers2(df)

# Drop outliers

print(Outliers_to_drop)

输出:[2, 3, 4]

效果描述:将输入的df清除异常值

理论:

首先计算出第一四分位数(Q1)、中位数、第三四分位数(Q3)。

中位数我们都知道,就是将一组数字按从小到大的顺序排序后,处于中间位置(也就是50%位置)的数字。

同理,第一四分位数、第三四分位数是按从小到大的顺序排序后,处于25%、75%的数字。

令 IQR=Q3−Q1IQR=Q3−Q1 ,那么 Q3+1.5(IQR)Q3+1.5(IQR) 和 Q1−1.5(IQR)Q1−1.5(IQR) 之间的值就是可接受范围内的数值,这两个值之外的数认为是异常值。

抄袭一张图:

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户想要用Python实现四分处理异常值的代码。我需要参考之前提供的引用内容,整理出合适的代码示例,并确保解释清楚步骤。 首先,用户的问题是关于使用四分IQR)来处理异常值,所以需要明确四分的步骤:计算Q1、Q3,得到IQR,然后确定上下限,将超出范围的值替换为边界值。 根据引用2,有一个函数示例,使用Pandas的quantile方计算分数,然后通过loc进行替换。引用3和4也提到了类似的方,使用NumPy的percentile或者quantile函数。需要确定是用Pandas还是NumPy,但通常Pandas更直接处理DataFrame。 用户提供的引用2中的函数可能更适合,因为它处理的是DataFrame的列,并且返回处理后的数据。不过需要注意代码中的潜在问题,比如深拷贝的使用,以及如何避免SettingWithCopyWarning。需要确保在修改数据时使用.loc或者避免链式赋值。 另外,引用3和4提到如何计算IQR和阈值,然后筛选异常值。但用户需要的是处理(盖帽)而不是仅仅识别,所以重点应放在替换异常值上。 可能需要注意的地方:函数是否需要处理特定列,比如排除某些不处理的列,如引用2中的del_cols参数。用户可能需要一个灵活的函数,可以指定哪些列不需要处理。 在代码实现中,需要导入必要的库,比如pandas和copy。函数结构可能需要接收数据框和排除列,然后遍历其他列进行处理。 测试部分,引用2中的main函数示例可以展示如何调用函数,并检查结果。需要确保示例数据能够正确运行,比如读取CSV文件,调用处理函数,然后查看描述统计。 此外,需要解释代码的每一步,比如为什么要用深拷贝,如何计算分数,替换逻辑等。还要提到常见的错误,比如SettingWithCopyWarning,以及如何避免,比如使用copy()或者.loc。 可能还需要对比不同方的优劣,比如使用Pandas内置方相比NumPy的优势,或者处理大数据集时的效率问题。 最后,确保代码符合Pandas最佳实践,避免潜在错误,并给出使用示例,让用户能够直接复制粘贴并应用到自己的数据上。</think>以下是通过四分IQR处理异常值Python代码实现及分步说明: --- ### **Python四分处理异常值代码实现** ```python import pandas as pd import numpy as np def iqr_outlier_capping(df, exclude_cols=None): """ 使用四分间距盖帽处理数值型列的异常值 :param df: 待处理的数据框(DataFrame) :param exclude_cols: 不处理的列名列表(如ID列、分类列) :return: 处理后的数据框 """ processed_df = df.copy() numeric_cols = processed_df.select_dtypes(include=np.number).columns.tolist() if exclude_cols: numeric_cols = [col for col in numeric_cols if col not in exclude_cols] for col in numeric_cols: q1 = processed_df[col].quantile(0.25) q3 = processed_df[col].quantile(0.75) iqr = q3 - q1 lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr # 替换超出范围的值为边界值(盖帽) processed_df[col] = processed_df[col].clip(lower=lower_bound, upper=upper_bound) return processed_df # 示例调用 if __name__ == '__main__': data = pd.read_csv('your_data.csv') # 排除非数值列或不需要处理的列(如ID、标签列) cleaned_data = iqr_outlier_capping(data, exclude_cols=['id', 'target']) cleaned_data.describe() ``` --- ### **分步说明** 1. **数据拷贝** `df.copy()` 创建原始数据的副本,避免修改原始数据[^2]。 2. **筛选数值列** `select_dtypes(include=np.number)` 自动选择数值型列,跳过分类、文本等非数值列。 3. **计算四分点** - 使用Pandas的`.quantile(0.25)`和`.quantile(0.75)`计算Q1和Q3[^3] - 计算IQR:$IQR = Q3 - Q1$ 4. **确定异常值边界** 根据公式确定上下限: $$ \text{下限} = Q1 - 1.5 \times IQR $$ $$ \text{上限} = Q3 + 1.5 \times IQR $$ 5. **盖帽处理** 使用`.clip(lower, upper)`将超出边界的值替换为边界值,比逐行替换更高效且避免`SettingWithCopyWarning`[^4]。 --- ### **注意事项** - **避免链式索引**:直接使用`df[col] = ...`而非链式赋值(如`df[col][condition]`),防止Pandas警告[^1]。 - **分数计算逻辑**:Pandas的`.quantile()`默认使用线性插值,与NumPy的`np.percentile`结果可能略有差异[^3]。 - **适用场景**:适用于对称分布数据,对偏态分布可能需调整系数(如将1.5改为3)[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值