参考百度百科数据清洗的介绍。本篇介绍数据清洗的基本概念、原理及常用的清洗方法,并附有相应的代码以作参考。
数据清洗
一、理论基础
1. 数据清洗的基本概念
数据清洗从名字上可通常理解为对于获取到的初始数据所做的审查和校正的过程,经过对错误、不理想以及低质量数据的清洗,最终呈现出符合我们所要求的高度正确、理想、高质量的数据。
不符合要求的数据主要是不完整的数据、错误的数据、重复的数据三大类,同时我们的检查程序通常也包括检查数据一致性、处理无效值和缺失值等基本步骤。在下文会对这些基本步骤做一个简单介绍。
2. 数据清洗的原理
利用有关技术如数理统计、数据挖掘或预定义的清理规则将脏数据转化为满足数据质量要求的数据。
图片来源:百度
3. 数据清洗的方法
- 处理不完整数据( 即值缺失)的方法:多数情况下,缺失值需要手动填入,但有时也可用均值、众数等方法来估计填充缺失值。
- 处理重复数据的方法:若统计需求是获得唯一不重复的数据,我们可以用消除或合并的方法处理数据,这也是基本的去重方法。
- 错误值及不一致性数据的处理方法:对于数据类型不一致,或与逻辑值有较大偏差的错误值等可用删除、填充等方法。
下图为数据清理的一个简单思维导图,介绍了一些常用的基本方法:
二、 代码演示
下面我们创建一个包含空值、异常值的简单数据集,用于介绍数据清理方法的代码,真实的数据集远比这个要复杂得多:
import pandas as pd
df=pd.DataFrame({'A':['a0','a1','a1','a2','a3','a4'],
'B':['b0','b1','b2','b2','b3',None],
'C':[1,2,None,3,4,5],
'D':[0.1,10.2,11.4,8.9,9.1,12],
'E':[10,19,32,25,8,None],
'F':['f0','f1','g2','f3','f4','f5']})
df
注:字符类型的空值输出为None,数值类型的空值输出为NaN(Not a Number)。
1. 空值的识别及处理
df.isnull() #判断数据是否是空值,输出True和False
识别空值后可直接删除包含空值的所有行,也可指定列删除,还可用统计值填充。
df.dropna() #删除空值所在的行
df.dropna(subset=['B']) #删除B列空值所在的行
df.fillna(df['E'].mean()) #所有的空值用E列的均值填充
df['E'].fillna(df['E'].mean()) #E列的空值用E列的均值填充
此图为第二行代码执行的结果
df['E'].interpolate() #采用插值的方法返回相邻两个数的平均值,用时需要指定那一列
2. 重复值的识别及处理
df.duplicated(['A']) #识别A列的重复值
df.duplicated(['A','B']) #识别A、B列同一行是否都存在空值
df.drop_duplicates(['A'],keep='first') #删除A列重复值所在的行,first为保留第一个重复值,同时也可设置last(保留最后一个),False(不保留任何重复值)
3. 异常值的识别及处理
upper_q=df["D"].quantile(0.75) #quantitle()为取分位数的函数,在这取上四分位数Q3
lower_q=df["D"].quantile(0.25) #取下四分位数Q1
q_int=upper_q-lower_q #求四分位间距(Q3-Q1)
k=1.5
df[df["D"]>lower_q-k*q_int][df["D"]<upper_q+k*q_int] #将不在[Q1-k*(Q3-Q1),Q3+k*(Q3-Q1)]视为异常值
也可用箱线图直观展示异常值情况,因为该数据规模较小,故不运行并展示结果,相关代码如下:
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(y=df['D'])
plt.show
观察F列可以看到多数数据以字母f开头,这时可以将g开头的数据作为异常值并返回f开头的数据。
df[[True if item.startswith('f') else False for item in list(df['F'].values)]]
以上就是一个较为简单的数据清洗过程,我的道行还远远不够,还得多学习。
这篇笔记是我跟着一名B站up主所记录的,有需要的伙伴可移步观看:
https://www.bilibili.com/video/BV1h34y147z1/?spm_id_from=333.337.search-card.all.click