基于百分位极差和1.5IQR原则利用python快速直观地筛选异常值

 

我们在进行数据清洗和预处理的时候,根据箱线图能发现数据有异常值:

甚至有些极端异常值直接影响后续计算:

当我们面临数据量很大,而且需要加入人的主观意愿对数据异常进行删除或保留的时候,下面代码提供了一种简便直观的操作,可以直接在原始数据表中把异常值标记出来:

import pandas as pd
import openpyxl
from openpyxl.styles import PatternFill
# 读取CSV文件
file_path = r'输入你的工作路径\输入你的数据.csv'
df = pd.read_csv(file_path)

def highlight_outliers(val):
    try:
        if float(val) < lower_bound or float(val) > upper_bound:
            return 'background-color: red'
    except:
        pass
    return ''
# 定义函数来标记异常值
def highlight_outliers(s):
    Q1 = s.quantile(0.25)
    Q3 = s.quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    return ['background-color: red' if x < lower_bound or x > upper_bound else '' for x in s]

df_styled = df.style.apply(highlight_outliers, axis=0)

o
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个数据处理的问题,我可以为您提供一些思路。 对于这个问题,我们可以先计算Age和Fare字段的四分位数(Q1、Q3),然后计算IQR(Q3-Q1)和异常值的阈值(1.5*IQR+Q3或Q1-1.5*IQR),最后找出Age和Fare字段异常值,并输出去掉这些异常值的记录的三组数据。 具体操作可以使用Python的pandas库,代码如下: ``` import pandas as pd # 读取数据 data = pd.read_csv('data.csv') # 计算Age、Fare字段的四分位数 age_q1 = data['Age'].quantile(q=0.25) age_q3 = data['Age'].quantile(q=0.75) fare_q1 = data['Fare'].quantile(q=0.25) fare_q3 = data['Fare'].quantile(q=0.75) # 计算IQR异常值的阈值 age_iqr = age_q3 - age_q1 fare_iqr = fare_q3 - fare_q1 age_upper = age_q3 + 1.5 * age_iqr age_lower = age_q1 - 1.5 * age_iqr fare_upper = fare_q3 + 1.5 * fare_iqr fare_lower = fare_q1 - 1.5 * fare_iqr # 找出Age和Fare字段异常值 age_outlier = data[(data['Age'] > age_upper) | (data['Age'] < age_lower)] fare_outlier = data[(data['Fare'] > fare_upper) | (data['Fare'] < fare_lower)] # 输出去掉Age、Fare、以及所有异常值的记录的三组数据(共9组) data_no_age = data.drop('Age', axis=1) data_no_fare = data.drop('Fare', axis=1) data_no_outlier = data[(data['Age'] <= age_upper) & (data['Age'] >= age_lower) & (data['Fare'] <= fare_upper) & (data['Fare'] >= fare_lower)] print("去掉Age字段的记录:") print(data_no_age) print("\n去掉Fare字段的记录:") print(data_no_fare) print("\n去掉所有异常值的记录:") print(data_no_outlier) ``` 这样就可以按照1.5IQR原则判断异常值,并输出去掉Age、Fare、以及所有异常值的记录的三组数据了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值