重复值、异常值、缺失值处理

在数据的录入和处理过程中,不可避免会产生重复值、缺失值及异常值

1、重复值处理

# 重复值处理
import pandas as pd
data = pd.DataFrame([[1,2,3],[1,2,3],[4,5,6]],columns=['c1','c2','c3'])
data

1.1 直接删除

# 1、2行是重复的,使用duplicated()查询重复得内容
print(data[data.duplicated()])
# 计算重复得数量
print(data.duplicated().sum())
# 删除重复的行
data1 = data.drop_duplicates()
data1

1.2 指定变量判断是否删除

# 指定变量判断是否删除
print(data.drop_duplicates(subset=['c1','c3'],keep='first',inplace=False))
# first保留第一个,inplace=True对原始数据修改
# 注意上面删除了重复得行之后,并没有改变原表的结构,所以drop_duplicates()函数并不会改变原表的结构,
# 所以需要重新赋值,或者在其中设置inplace = True

2、缺失值处理

# 1.2缺失值处理
import numpy as np
import pandas as pd
data1 = pd.DataFrame([[1,np.nan,3],
                     [np.nan,2,np.nan],
                     [1,np.nan,0]],columns=['c1','c2','c3'])
data1
# 可以使用isnull()函数或者isna()函数来查看空值
print(data1.isnull())
data1.isna()
# 各变量中缺失值的数量
data1.isnull().sum(axis=0)
# 对单列查看空值
data1['c1'].isnull()
# 如果数据量较大,可以通过如下代码筛选出某列中内容为空值的行
data1[data1['c1'].isnull()]
# 对于空值的处理方式有两种,一种是删除空值,一种是填补空值
# 删除空值
a = data1.dropna()
a
# 也可以对上述函数设置thresh参数,例如将其设置为n,表示如果一行中的非空值少于n个则保留该行
a1 = data1.dropna(thresh=2)
a1

2.1 用0填补缺失值

# 用fillna()填补空值
# 定义缺失值为0
data_null_0 = data1.fillna(0,inplace=False)
print(data_null_0)

2.2 用均值填补

# 用均值填补
b = data1.fillna(data1.mean())
print(b)

2.3 用中位数填补

# 用中位数填补
c = data1.fillna(data1.median())
print(c)

2.4 用空值上方或者下方的值替换

# 用空值上方或下方的值替换空值
d = data1.fillna(method='pad')  # pad表示用上方值替换,如果上方不存在或者也是空值,则布替换
print(d)
# 用下方值替换
e = data1.fillna(method='backfill')
print(e)

3、异常值处理

# 异常值处理
import numpy as np
import pandas as pd
data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
                     'c2':[15,16,14,100,19,11,8],
                      'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
data2

3.1 利用箱体图检验异常值

# 利用箱体图和标准差来进行异常值检验
import matplotlib.pyplot as plt
plt.grid(True)
plt.boxplot(data2,labels=['c1','c2','c3'],flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10})

3.2 IQR筛选异常值

# 筛选异常值(IQR)
"""
优点:简单、可解释性强
缺点:鲁棒性差,准确性差,只能剔除明显的异常值
"""
# 算出上届和下界
q1 = data2.quantile(0.25)
q3 = data2.quantile(0.75)
iqr = q3 - q1
bottom = q1 -1.5*iqr  # 下界
upper = q3 + 1.5*iqr  # 上界
print(bottom)
print(upper)
# 筛选异常值
error = data2[(data2 < bottom) | (data2 > upper)]
print(error)
data = data2[(data2 >= bottom) & (data2 <= upper)]
print('异常值共%i条'%len(error))
data

3.3 利用标准差检验异常值

"""
利用标准差检查,当数据服从标准正态分布时,99.7%的数值距离均值3倍sigma之内,
95.4%的数值距离均值2倍sigma之内,
在3倍sigma之外的值可以认为是异常值,也可以将阈值设置为两个标准差
"""
import numpy as np
import pandas as pd
data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
                     'c2':[15,16,14,100,19,11,8],
                      'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
data2
# 判断是否符合正态分布,pvalue大于0.05则认为数据呈正态分布
from scipy import stats
mean = data2['c1'].mean()
std = data2['c1'].std()
print(stats.kstest(data2['c1'],'norm',(mean,std)))  # 呈正态分布
columns = ['c1','c2','c3']
for i in columns:
    mean = data2[i].mean()
    std = data2[i].std()
    print(stats.kstest(data2[i],'norm',(mean,std)))
f = pd.DataFrame()
for i in data2.columns:
    z = (data2[i]-data2[i].mean())/data2[i].std()  # 标准化
    f[i] = abs(z)>2  # abs计算绝对值
f
# 如何处理异常值
"""
1、删除含异常值的记录
2、将异常值视为缺失值
3、数据分箱的方法进行处理
4、插补法
5、不处理
"""

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值