数据清洗一般有以下四个部分:1.重复值处理;2.缺失值处理;3.异常值处理;4.数据离散化处理
一.重复值处理:
一般重复值采取删除,特殊情况例外,具体根据业务数据决定,以下就是重复值处理的一些代码:
1 df[df.duplicated()]#整个数据集中完全重复的
2 df[df.duplicate()==False]#除去完全重复的
3 np.sum(df.duplicated()) #统计重复的数量
4 df.drop_duplicates(inplace = True)#除去重复的,与2等价
5 df.drop_duplicates(subset=['列名1','列名2'],inplace = True)#删除某列重复的
6 any(df.duplicated()) 判断是否有重复值 返回TRUE就是有重复值,false就是没有
二.缺失值处理:
根据实际情况而定,有删除法、替换法(均值替换、前向、后向或者常数替换法)或者插值法等,前向替换就是用缺失值所在的行的前一行的那个数据替换,后向替换就是后一个数据替换;代码实现如下:
1 data.apply(lambda x: sum(x.isnull())/len(x),axis = 0) #看每列缺失值的比例
2 data.count()/data.shape[0] #非缺失值的比例
3 data['列名'].fillna(data['列名'].mean())
4 data.fillna(method = 'pad'/'ffill') #前向填充:用前一个非缺失值去填充该缺失值
5 data.fillna(method = 'backfill' / 'bfill') #后向填充:用后一个非缺失值填充
6 data.fillna(value = {'列名1':data['列名1'].mean(),'列名2':'0'},inplace=True)#多列填充
三.异常值处理:
指一组数据中偏离正常范围的值,不是错误值;异常值出现频率较低,但会对实际项目分析造成偏差。异常值一般用箱型图(分位差法)或者分布图(标准差法)来判断;
标准差法:一组数据的上界一般等于μ+2*σ(2.5*σ、3*σ),下界等于μ-2*σ(2.5*σ、3*σ)等这个方法判断;
箱型图法:分位差=3/4分位数-1/4分位数;上界则是3/4分位数+1.5*分位差,下界则是1/4分位数-1.5*分位差。
往往采取盖帽法或者数据离散化。相关代码如下:
#标准差法
upline = df['money'].mean()+2.5*df['money'].std() #上界
lowline = df['money'].mean()-2.5*df['money'].std() #下界
outlines = df[(df['money']>upline) | (df['money']<lowline)] #异常点
#箱型图法
df.describe() #整体描述数据
IQR=df.quantile(0.75)-df.quantile(0.25)
upline = df.quantile(0.75) + 1.5*IQR
lowline = df.quantile(0.25)- 1.5*IQR
#绘图
import matplotlib.pyplot as plt
df['money'].plt(kind='box') #箱型图
df['money'].plt(kind='hist',bins=30,density=True) #分布图
df['money'].plt(kind='kde')
plt.show()
四.数据离散化
等同于分箱:一般有等频分箱或等宽分箱,一般使用pd.cut()或者pd.qcut(),代码如下:
pd.cut(x,bins,right=True,labels)
x:数据
bins:离散化的数目,或者区分的区间
right=True:代表左开右闭
labels:离散化后各个类别的标签
df['score_bin']=pd.cut(df['score'],bins=5,labels=range(5)) #等宽分箱
df['score_bin'].value_counts().plot(kind='bar')
#自定义分割
w = [100,1000,10000,20000]
df['score_bin']=pd.cut(df['score'],bins=w,labels=range(3))
#等频分段
k=5
w=[1.0*i/k fro i in range(k+1))
pd.qcut(df['score'],q = w)
分位点:
k=5
w1 = df['score'].quantile([1.0*i/k fro i in range(k+1)])
w1[0]=w1[0]*0.95 最小更小
w1[1.0]=w1[1.0]*1.1 最大更大