1、第8章 用pandas进行数据预处理学习目标:l 掌握重复值、缺失值和异常值的处理。l 掌握数据合并和数据抽取。l 掌握重塑层次化索引、映射与数据转换。l 掌握排列与随机抽样。l 掌握日期和字符串处理。数据清洗是发现并纠正数据文件中可识别的错误,如移除重复数据,处理缺失值和空格值,检测和过滤异常值,并检查数据一致性等。通过数据清洗不仅要使通过清洗后的数据变的可用,而且还要使数据变的更加适合进行后续的数据分析工作。从数据采集所获得的原始数据集中,往往会存在着许多重复数据。所谓重复数据是指在数据结构中所有列的内容都相同,即行重复。而处理重复数据是数据分析中经常要面对的问题之一。8.1.1 重复值的
2、处理 pandas提供了duplicated()和drop_duplicates()函数可用于标记及删除重复数据。1、duplicated()函数 duplicated()函数用于标记Series中的值、DataFrame中的记录行是否是重复,重复为True,不重复为False。函数语法格式及参数说明见教材。2、drop_duplicates()函数 drop_duplicates()函数用于删除Series、DataFrame中重复记录,并返回删除重复后的结果。函数语法格式及参数说明见教材。示例【例8-1】8.1.1重复值的处理 在Python中,pandas使用浮点值NaN表示浮点数和非浮
3、点数组中的缺失值,同时Python内置None值也会被当作是缺失值。在处理缺失值之前,首先要判断缺失值是否存在,然后再对缺失值进行删除、填充或者不处理的操作。1、判断缺失值的函数 (1)isnull()函数:用于检查空值或缺失值的对象;如果有空值或缺失值则返回True,否则返回False。(2)notnull()函数:用于检查不为空值或缺失值的对象;如果有空值或缺失值则返回False,否则返回True。通过isnull()函数和sum()函数可以获得Series和DataFrame中缺失值的数量 8.1.2 缺失值的处理 2、处理缺失值的方法 (1)删除含有缺失值的记录 在数据分析中,如果数据
4、集的样本很大,并且在删除含有缺失值的记录后,不会影响分析结果的客观性和准确性时,一般是使用dropna()函数直接将空值或缺失值的数据删除。dropna()函数说明见教材,应用示例【例8-2】。(2)数据插补法 在数据分析中,如果数据集的样本比较少或者由于删除含有缺失值的记录会影响到数据分析结果的客观性和准确性时,就需要根据数据插补的方法来选择填充值,然后再使用fillna()函数对空值或缺失值进行填充。fillna()函数说明、常用数据插补方法见表8-1见教材,应用示例【例8-3】8.1.2 缺失值的处理 所谓异常值,就是在数据集中存在不合理的值,又称离群点。例如年龄为负数,成绩大于100或
5、小于零,商品评分超出5分或商品日销售量远远超过年销售量等,都属于异常值的范围。1.判别数据集中异常值方法 (1)散点图分析 (2)简单统计分析 例如,年龄属性值的区间规定为0:150,如果数据集样本中的年龄值不在该区间范围内,则表示该样本的年龄属性属于异常值。8.1.3 异常值的处理 1.判别数据集中异常值方法 (3)3原则 3原则是指当数据服从正态分布时,根据正态分布的定义可知,距离平均值3之外的概率为 P(|x-|3),小于(=),小于等于(=),不等于(!=)。范围运算:between(left,right)。空值匹配:pandas.isnull(column)。字符匹配:str.con
6、tains(patten,na=False),其中na参数是指空值的处理方式,如为False,不匹配空值。逻辑运算:与(&),或(|),取反(not)。示例示例【例例8-8】8.3.2 记录抽取 在数据处理时,有时需要对数据的结构进行重排,也称作是重塑(reshape)或者轴向旋转(pivot)。在pandas中提供了实现重塑的两个函数,即stack()函数和unstuck()函数。常见的数据层次化结构有两种,一种是表格,如图8-3所示,另一种是“花括号”,如图8-4所示。1、stack()函数 stack()函数将数据从”表格结构“变成”花括号结构“,即将其行索引变成列索引。2、unstac
7、k()函数 unstack()函数将数据从”花括号结构“变成”表格结构“,即要将其中一层的列索引变成行索引。stack()函数和unstuck()函数格式和参数见教材。示例代码example8-4.py。8.4 重塑层次化索引 映射就是创建一个映射关系列表,把元素和一个特定的标签或者字符串绑定起来。定义映射关系最好是使用字典。例如:map=label1:value1,label2:value2,在pandas中提供了利用映射关系来实现某些操作的函数如下。1、利用replace()函数替换元素 例如,创建字典fruits用于指明水果标识和水果名称的映射关系。fruits=101:orange,1
8、02:apple,103:banana 如要将用于存储水果标识、水果数量和单价的DataFrame对象中的水果标识替换成水果名称,就需要运用replace()函数,通过fruits映射关系来实现元素的替换。replace()函数的基本语法格式和参数见教材。示例示例【例例8-9】8.5.1 用映射替换元素在【例8-9】中介绍了利用函数和映射来实现将水果标识替换成水果名称的方法。但是有时需要保留水果标识,将水果名称添加到数据集中。那么,这时可利用map()函数,通过构建fruits映射关系来实现元素的添加。map()函数的基本语法格式和参数见教材。示例示例【例例8-10】8.5.2 用映射添加元素
9、 在数据处理中,有时需要使用映射关系转换轴标签。pandas的rename()函数,是以表示映射关系的字典对象作为参数,替换轴的索引标签。rename()函数的基本语法格式和参数见教材。示例示例【例例8-11】8.5.3 重命名轴索引 1.排列 利用numpy.random.permutation()函数,可以返回一个序列的随机排列。将此随机排列作为take()函数的参数,通过应用take()函数就可实现按此随机排列来调整Series对象或DataFrame对象各行的顺序。示例代码example8-6.py。2.随机采样 随机抽样是指随机从数据中按照一定的行数或者比例抽取数据。随机抽样的函数:
10、numpy.random.randint(start,end,size)函数中的参数说明见教材。示例代码example8-7.py。8.6 排列与随机抽样 1日期转换 日期转换是指将字符型的日期格式的数据转换成为日期型数据的过程。日期转换函数to_datetime()的语法格式:pandas.to_datetime(dateString,format)函数中的参数说明:p dateString:表示字符型时间列。p format:表示时间日期格式,见表8-2。8.7 日期转换、日期格式化和日期抽取 2、日期格式化 日期格式化是将时间日期型数据,按照指定格式,转为字符型数据。日期格式化函数:df
11、_dt.apply(lambda x:datetime.strftime(x,format)或 df_dt.dt.strftime(format)函数中的参数说明:p df_dt:表示数据框中时间列名。p format:表示时间日期格式,见表8-2。8.7 日期转换、日期格式化和日期抽取 3、日期抽取 日期抽取是指从日期格式里面抽取出需要的部分属性。抽取语法:df_dt.dt.property 参数说明:p df_dt:表示数据框中时间列名。p property:表示时间属性,见表8-3示例代码example8-8.py。8.7 日期转换、日期格式化和日期抽取 在pandas字符串操作中,常用
12、的字符串处理方法如下。1.字符串拆分 split()函数的作用是通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串,其语法格式:str.split(str=,num=string.count(str)参数说明:p str:表示字符串的分隔符,默认为所有的空字符,包括空格、换行(n)、制表符(t)等。p num:表示分割次数。函数返回值:分割后的字符串列表。示例代码example8-9.py。8.8.1 内置的字符串处理方法 在pandas字符串操作中,常用的字符串处理方法如下。2、移除字符串头尾指定的字符 strip()函数可用于移除字符串头尾指定的字符(
13、默认为空格)。示例代码example8-10.py。3、字符串连接 join()函数可以将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。示例代码example8-11.py8.8.1 内置的字符串处理方法 在pandas字符串操作中,常用的字符串处理方法如下。4、判断是否是子字符串 判断是否是子字符串可以使用in关键字,或者使用find()函数和index()函数判断一个子字符串的位置。find()函数作用是查找子字符串,若找到返回从0开始的下标值,若找不到返回-1。find()函数返回值是返回子字符串第一次出现的位置的下标值。index()函数作用是在字符串里查找子
14、串第一次出现的位置,类似字符串的find方法,如果查找不到子串,会抛出异常。示例代码example8-12.py8.8.1 内置的字符串处理方法 在pandas字符串操作中,常用的字符串处理方法如下。5、判断子字符串出现的次数 count()函数可用于统计字符串里某个字符出现的次数,函数的可选参数为字符串搜索的开始与结束位置。函数返回值:返回子字符串在字符串中出现的次数。示例代码example8-13.py 6、替换子字符串 replace()函数可将字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。示例代码example8-14.py8.8
15、.1 内置的字符串处理方法 正则表达式是一个特殊的字符序列,使用正则表达能很方便地在文中查找和匹配字符串模式。Python自1.5版本起增加了re模块,re模块使Python语言拥有全部的正则表达式功能。单条正则表达式通常被称作regex,它是根据正则表达式语言编写的字符串。Python内置的re模块用于操作regex对象。只有使用import re语句,先导入re模块,才能使用正则表达式。re模块所提供的函数分为三类:模式匹配、替换和拆分。8.8.2 正则表达式 1、compile()函数 compile()函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和
16、search()这两个函数使用。2、正则表达式对象 正则表达式对象也称为RegexObject对象。(1)正则表达式修饰符 正则表达式修饰符标志(flags)参数见表8-4 8.8.2 正则表达式 2、正则表达式对象 (2)正则表达式模式 正则表达式模式是使用特殊的语法来表示一个正则表达式,它的规则:p正则表达式模式中的字母和数字匹配相同的字符串。p多数字母和数字前加一个反斜杠时会拥有不同的含义。p标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。p反斜杠本身需要使用反斜杠转义。p由于正则表达式通常都包含反斜杠,如模式元素rt,等价于 t。因此,正则表达式中一般都使用r.(raw字符串)
17、来定义规则字符串。p正则表达式模式语法中的特殊元素见表8-58.8.2 正则表达式 3、re.match()函数 re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。示例代码example8-15.py。4、re.search()函数 re.search()函数扫描整个字符串并返回第一个成功的匹配。示例代码example8-16.py。注意:re.match()函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search()函数匹配整个字符串,直到找到一个匹配。8.8.2 正则表达
18、式 5、检索和替换 re模块提供了re.sub()函数用于替换字符串中的匹配项。示例代码example8-17.py。6、findall()函数 findall()函数可在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。示例代码example8-18.py。8.8.2 正则表达式 7、re.finditer()函数 finditer()函数与findall()函数类似,可在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。示例代码example8-19.py。8、re.split()函数 split()函数按照能够匹配的子串将字符串分
19、割后返回列表。示例代码example8-20.py。8.8.2 正则表达式 1、cat()字符串连接 cat()函数可实现元素级的字符串连接操作,并可指定分隔符。2、split()切分字符串 split()函数可根据分隔符或正则表达式对字符串进行拆分。3.get()获取指定位置的字符串 get()函数可获取各元素的第i个字符。示例代码example8-21.py。除了cat()、split()和get()函数外,Series类的str自带的其它函数,即矢量化的字符串函数见表8-6,其函数语法格式是Series.str.函数名(参数)。8.8.3 矢量化的字符串函数项目实践项目描述 根据美国农业
20、部(USDA)制作的一份关于食物营养信息的数据库,该数据的JSON数据结构中除了包含了每种食物的“id”、“description”、“tags”、“manufacturer”、“group”属性外,还包含了“portions”和“nutrients”这两个列表,其中“nutrients”列表中包含了营养成分和份量。要求对USDA食物营养信息的JSON数据完成食物类别的分布情况和全部食物营养成分的数据分析。本章小结 本章首先重点介绍了利用pandas实现对重复值、缺失值和异常值的数据清洗方法,还介绍了按键连接数据、沿轴连接数据和合并重叠数据的数据合并方法,及字段拆分与抽取和记录抽取方法。同时,还介绍了重塑层次化索引,利用映射实现数据转换,数据排列与随机抽样,日期转换、日期格式化和日期抽取,字符串处理方法等。谢谢!