
3.7 数据清洗
3.7.1 缺失值查看与处理
缺失值是指由于某种原因导致数据为空,这种情况一般有不处理、删除、填充/替换、插值(以均值/中位数/众数等填补)这4种处理方式。
1.缺失值查看
首先需要找到缺失值,主要使用DataFrame对象的info()方法。
【示例37】 查看数据概况。(示例位置:资源包\MR\Code\03\37)
以淘宝销售数据为例,首先输出数据,然后使用info()方法查看数据,程序代码如下:
01 import pandas as pd 02 df=pd.read_excel('TB2018.xls') 03 print(df) 04 print(df.info())
运行程序,控制台输出结果如图3.43所示。

图3.43 缺失值查看
在Python中,缺失值一般用NaN表示,如图3.43所示。通过info()方法可看到“买家会员名”“买家实际支付金额”“宝贝标题”“订单付款时间”的非空数量是10,而“宝贝总数量”和“类别”的非空数量是8,那么说明这两项存在空值。
【示例38】 判断数据是否存在缺失值。(示例位置:资源包\MR\Code\03\38)
接下来,判断数据是否存在缺失值还可以使用isnull()方法和notnull()方法,主要代码如下:
01 print(df.isnull()) 02 print(df.notnull())
运行程序,控制台输出结果如图3.44所示。

图3.44 判断缺失值
使用isnull()方法缺失值返回True,非缺失值返回False;而notnull()方法与isnull()方法正好相反,缺失值返回False,非缺失值返回True。
如果使用df[df.isnull() == False],则会将所有非缺失值的数据找出来,只针对Series对象。
2.缺失值删除处理
通过前面的判断得知数据缺失情况,下面将缺失值删除,主要使用dropna()方法,该方法用于删除含有缺失值的行,主要代码如下:
df1=df.dropna()
运行程序,输出结果如图3.45所示。
说明
有些时候数据可能存在整行为空的情况,此时可以在dropna()方法中指定参数how='all',删除所有空行。

图3.45 缺失值删除处理1
从运行结果得知:dropna()方法将所有包含缺失值的数据全部删除了。那么,此时如果我们认为有些数据虽然存在缺失值,但是不影响数据分析,那么可以使用以下方法处理。例如,上述数据中只保留“宝贝总数量”不存在缺失值的数据,而类别是否缺失不关注,则可以使用notnull()方法判断,主要代码如下:
df2=df[df['宝贝总数量'].notnull()]
运行程序,输出结果如图3.46所示。

图3.46 缺失值删除处理2
3.缺失值填充处理
对于缺失数据,如果比例高于30%可以选择放弃这个指标,做删除处理;低于30%尽量不要删除,而是选择将这部分数据填充,一般以0、均值、众数(大多数)填充。DataFrame对象中的fillna()函数可以实现填充缺失数据,pad/ffill表示用前一个非缺失值去填充该缺失值;backfill/bfill表示用下一个非缺失值填充该缺失值;None用于指定一个值去替换缺失值。
【示例39】 将NaN填充为0。(示例位置:资源包\MR\Code\03\39)
对于用于计算的数值型数据如果为空,可以选择用0填充。例如,将“宝贝总数量”为空的数据填充为0,主要代码如下:
df['宝贝总数量'] = df['宝贝总数量'].fillna(0)
运行程序,输出结果如图3.47所示。

图3.47 缺失值填充处理
3.7.2 重复值处理
对于数据中存在的重复数据,包括重复的行或者几行中某几列的值重复一般做删除处理,主要使用DataFrame对象的drop_duplicates()方法。
【示例40】 处理淘宝电商销售数据中的重复数据。(示例位置:资源包\MR\Code\03\40)
下面以“1月.xlsx”淘宝销售数据为例,对其中的重复数据进行处理。
(1)判断每一行数据是否重复(完全相同),主要代码如下:
df1.duplicated()
如果返回值为False表示不重复,返回值为True表示重复。
(2)去除全部的重复数据,主要代码如下:
df1.drop_duplicates()
(3)去除指定列的重复数据,主要代码如下:
df1.drop_duplicates(['买家会员名'])
(4)保留重复行中的最后一行,主要代码如下:
df1.drop_duplicates(['买家会员名'],keep='last')
说明
以上代码中参数keep的值有3个。当keep='first'表示保留第一次出现的重复行,是默认值;当keep为另外两个取值,即last和False时,分别表示保留最后一次出现的重复行和去除所有重复行。
(5)直接删除,保留一个副本,主要代码如下:
df1.drop_duplicates(['买家会员名','买家支付宝账号'],inplace=Fasle)
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示删除重复项后生成一个副本。
3.7.3 异常值的检测与处理
首先了解一下什么是异常值。在数据分析中异常值是指超出或低于正常范围的值,如年龄大于200、身高大于3米、宝贝总数量为负数等类似数据。那么这些数据如何检测呢?主要有以下几种方法。
(1)根据给定的数据范围进行判断,不在范围内的数据视为异常值。
(2)均方差。
在统计学中,如果一个数据分布近似正态分布(数据分布的一种形式,正态分布的概率密度函数曲线呈钟形,两头低、中间高、左右对称,因此人们又经常称之为钟形曲线),那么大约68%的数据值会在均值的一个标准差范围内,大约95%会在两个标准差范围内,大约99.7%会在3个标准差范围内。
(3)箱形图。
箱形图是显示一组数据分散情况资料的统计图。它可以将数据通过四分位数的形式进行图形化描述。箱形图通过上限和下限作为数据分布的边界。任何高于上限或低于下限的数据都可以认为是异常值,如图3.48所示。

图3.48 箱形图
说明
有关箱形图的介绍以及如何通过箱形图识别异常值可参见第6章。
了解了异常值的检测,接下来介绍如何处理异常值,主要包括以下几种处理方式。
(1)最常用的方式是删除。
(2)将异常值当缺失值处理,以某个值填充。
(3)将异常值当特殊情况进行分析,研究异常值出现的原因。