pandas处理异常值

异常值是与其他数据有明显不同的值,它们可能是由于数据收集错误、测量误差、或其他异常情况引起的。处理异常值的目标是使数据更加准确、可靠,并且适合用于后续的数据分析和建模。

处理异常值的方法:

  1. 3σ法则:计算数据的均值和标准差,然后根据3σ法则,将位于均值±3倍标准差之外的数据视为异常值。适合正太分布
  2. 箱线图(IQR方法):绘制箱线图,根据数据的四分位数(Q1,Q3)和四分位距(IQR=Q3-Q1),将位于Q1-1.5IQR和Q3+1.5IQR之外的数据视为异常值。
  3. 领域知识:根据数据的领域知识和业务规则来确定异常值。

1、3σ法则

import pandas as pd
import numpy as np

data=pd.Series(np.random.randint(0,100,size=300))
for i in range(2):
    data.iloc[np.random.randint(0,300)]=np.random.randint(1000,2000)
    data.iloc[np.random.randint(0,300)]=np.random.randint(-1000,-100)
#计算均值和标准差
mean=data.mean()
std=data.std()

#设置上下限
upper_limit=std+3*mean
lower_limit=std-3*mean

cond=(data>upper_limit)|(data<lower_limit)
print(data[cond])

 2、箱线图

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。

以下是使用箱线图处理异常值的步骤:
1.绘制箱线图:使用boxplot()方法绘制数据的箱线图。
2.确定异常值:观察箱线图,查找位于箱线之外的数据点,这些数据点被认为是异常值。
3.处理异常值:根据实际情况,您可以选择删除异常值、替换为特定值或进行其他处理。

  •  绘制箱线图
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
data=pd.DataFrame(np.random.randint(0,100,size=(100,1)),columns=['values'])
for i in range(2):#设置异常值
    data.loc[(np.random.randint(0,100)),('values')]=np.random.randint(200,300)
    data.loc[(np.random.randint(0,100)),('values')]=np.random.randint(-100,0)
data.boxplot(column='values')#绘制箱线图
plt.show()

  •  确定异常点
q1=data['values'].quantile(0.25)
q3=data['values'].quantile(0.75)
#根据数据的四分位数(Q1,Q3)和四分位距(IQR=Q3-Q1),
#将位于Q1-1.5IQR和Q3+1.5IQR之外的数据视为异常值。
iqr=q3-q1
lower_limit=q1-1.5*iqr
upper_limit=q3+1.5*iqr

cond=(data['values']>upper_limit)|(data['values']<lower_limit)
print(data[cond])

  • 处理异常点

 我们根据需求对这些异常点进行处理。 

通过插值法处理数据异常

适用于线性数值,其根据相邻数据点的值来推测异常值,pandas提供了interpolate()方法来进行插值处理。

pandas提供了interpolate方法来推测异常值。

语法:DataFrame['columns_name'].interpolate(参数)

参数

  • method:插值方法,默认是linear线性插值,可以选择其他方法如polynomial、spline等。(有很多)
  • axis:沿哪个轴插值,默认是0(行)。
  • limit:最多插值的缺失值数量。
  • inplace:是否在原地修改数据,默认是False。
  • limit_direction:插值方向,可以是forward、backward或者both。
  • order:如果method是polynomial,需要指定多项式的阶数。

代码示例:

import pandas as pd
import numpy as np

data= pd.DataFrame({'values':[10,12,13,14,15,16,20,22,24,25,100,32,36,38]})
#通过箱线表寻找异常点
q1=data['values'].quantile(0.25)
q2=data['values'].quantile(0.75)
iqr=q2-q1
lower_limit=q1-1.5*iqr
upper_limit=q2+1.5*iqr

cond=(data['values']>upper_limit)|(data['values']<lower_limit)#找到异常点
#将异常数据换成NaN
data.loc[cond,'values']=np.nan
df=data['values'].interpolate().to_frame()#这里返回的是series,通过to_frame()转变成dataframe
#通过interpolate()进行推测数据值
print(df)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值