(▲由Python大本营付费下载自视觉中国)
作者 | 李明江/张良均/周东平/张尚佳
来源 | 《Python3智能数据分析快速入门》
福利:关注Python大本营微信公众号,在评论区回复你的十一假期学习计划,点赞排名前五名可以获得机械工业出版社《Python3智能数据分析快速入门》一本。
活动截止时间:10月7日晚8点
机器学习对数据集有一定的要求,这就需要在训练之前对数据进行处理,使之符合训练要求。Pandas 提供了多种数据预处理的方法,包括缺失值处理、重复值处理、连续特征离散化处理、哑变量处理等方法。
缺失值处理
数据中的某个或某些特征的值是不完整的,这些值称为缺失值。对缺失值处理前需先识别缺失值,Pandas 提供 isnull 方法,能够识别出缺失值,返回 bool。isnull 方法结合其他操作,找出缺失值的数量及占比,如代码清单 7-31 所示。
识别缺失值后,需对缺失值进行处理,常见的处理方式分为 3 种:删除法、替换法、插值法。
1.删除法
删除法是指将含有缺失值的特征或者记录删除。删除法分为删除观测记录和删除特征两种,观测记录指删除行,特征指删除列,它属于利用减少样本量来换取信息完整度的一种方法,是一种最简单的缺失值处理方法。Pandas 提供了简便的删除缺失值的方法dropna,通过参数控制,该方法既可以删除观测记录,也可以删除特征,其基本语法格式
如下。
pandas.DataFrame.dropna(self, axis=
0, how=
'any', thresh=
None, subset=
None,
inplace=
False)
dropna 方法常用的参数及其说明如表 7-16 所示。
使用 dropna 方法删除指定列的缺失值,设置参数为 subset,如代码清单 7-33 所示。
2.替换法
替换法是指用一个特定的值替换缺失值。特征可分为数值型和类别型,两者出现缺失值时的处理方法是不同的。缺失值所在特征为数值型时,通常用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值;缺失值所在特征为类别型时,则选择用众数来替换缺失值。f illna 方法用于替换缺失值,其基本语法格式如下。
DataFrame.fillna(value=
None, method=
None, axis=
None, inplace=
False,
limit=
None)
fillna 方法常用的参数及其说明如表 7-17 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/aec7b3013f725dbca811aa8274ad6f6d.png)
使用 fillna 方法替换缺失值,如代码清单 7-34 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0eda7598fe1a3c744b3d114e85e1ca28.png)
使用 f illna 方法替换缺失值,不指定替换值,设置参数为 method,如代码清单 7-35 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/dfd41c8a0ce70f4837029834d68faba8.png)
3.插值法
删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法—插值法。
interpolate 方法用于对缺失值进行插值。针对 DataFrame 的 interpolate 方法,其基本语法格式如下。
DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False,
limit_direction='forward', limit_area=None, downcast=None, **kwargs)
interpolate 方法常用的参数及其说明如表 7-18 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2a45e27e5b25299fcaf6ad759391c179.png)
interpolate 方法提供了多种插值方法,常用插值方法及其说明如表 7-19 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d3f1fb1939f6e972221bda032e688e11.png)
使用常用插值方法插值,如代码清单 7-36 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/93b3d7c107646474a0bd2851cf4dbc83.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7a7f60a178379d7a685ce969b2c20e51.png)
除了常用的插值方法,interpolate 还提供其他方法。至于使用何种插值方法,可根据实际情况灵活选择。
重复数据处理
重复数据处理是机器学习经常面对的问题之一。对重复数据进行处理前,需要分析重复数据产生的原因以及去除这部分数据后可能造成的不良影响。
drop_duplicates 方法用于去除一个或多个特征的重复记录。针对 DataFrame 的 drop_duplicates 方法的基本语法格式如下。
DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False)
drop_duplicates 方法常用的参数及其说明如表 7-20 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/66ca05aee930d913a0dce503c823aa5c.png)
使用 drop_duplicates 方法去除数据中的重复记录,默认对所有特征起作用,即只有所有特征的重复记录对应的索引(行)相同的情况下才会执行去除操作,如代码清单 7-37所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/51358c686b7dddf7e6f5cd840054b1b0.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/cd70a4d1df4ba367ed5e97f04f2820fd.png)
连续特征离散化处理
某些算法,如 ID3 决策树算法和 Apriori 算法等,要求数据是离散的,此时就需要将连续型特征(数值型)转换成离散型特征(类别型),即连续特征离散化。连续特征离散化是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。因此离散化涉及两个子任务,即确定分类数以及如何将连续型数据映射到这些类别型数据上。其原理如图 7-2 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/be69d0de7add03ad875098881e53caad.png)
常用的离散化方法有 3 种:等宽法、等频法和通过聚类分析离散化(一维)。通过聚类分析离散化(一维)涉及聚类算法,此处暂不介绍。
1.等宽法
等宽法指将数据的值域分成具有相同宽度的区间,与制作频率分布表类似。cut 函数用于实现等宽法,其基础语法格式如下。
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3,
include_lowest=False)
cut 函数常用的参数及其说明如表 7-21 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/485f3d42c51a523df20b75bc59f43945.png)
表 7-21 cut 函数常用的参数及其说明
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d10c969d2dd742f581cbad635e8146e9.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/098b951169789660b6c1a069078400be.png)
使用等宽法离散化的缺陷从代码清单 7-39 中可以很明显地看出:等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目也会变得非常不均匀,有些区间包含许多数据,而另外一些区间的数据则极少。这会严重损坏所建立的模型。
2.等频法
等频法在等宽法的基础上实现,将切分区间指定为被切分数据的分位数,这样能保证切分区间的数据大体相等。结合函数对数据应用等频法,如代码清单 7-40 所示。
相较于等宽法,等频法避免了数据分布不均匀的问题,但同时也可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。
哑变量处理
哑变量又称虚拟变量,通常取 0 或 1。机器学习中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只有数值型,还会存在相当一部分的类别型,这部分的特征需要经过哑变量处理才可以放入模型之中。哑变量处理的原理如图 7-3 所示。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/669b37b36dc79f33b6a3ae42ab1cf9b6.png)
get_dummies 函数用于哑变量处理,其基本语法格式如下。
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False,
columns=None, sparse=False, drop_first=False)
使用 get_dummies 函数对类别型特征进行哑变量处理,如代码清单 7-41 所示。
代码清单 7-41 哑变量处理
从代码清单 7-41 的结果中可以发现,对于一个类别型特征,若其取值有 m 个,则经过哑变量处理后就变成了 m 个二元特征,并且这些特征互斥,每次只有一个激活,这使得数据变得稀疏。
综上所述,对类别型特征进行哑变量处理主要解决了部分算法模型无法处理类别型数据的问题,这在一定程度上起到了扩充特征的作用。由于数据变成了稀疏矩阵的形式,因此也加快了算法模型的运算速度。
小结
本章延续第 6 章,是 Pandas 的进阶篇。主要介绍了如下内容:
1)常见数据源类型如 CSV、Excel、数据库、剪切板、pickle 的读取和写入操作。
2)统计分析、分组运算、透视表和交叉表这 3 种针对数据的操作方法。
3)缺失值处理、重复值处理、连续特征离散化处理、哑变量处理等常见数据处理方法。
课后习题
1.选择题
(1)下列关于数据库数据读写,下列说法正确的有 。
A. read_sql_table 可以使用 sql 语句读写数据库数据
B. Pandas 除了 read_sql 没有其他数据库读写函数了
C. 使用 read_sql 函数读取数据库数据不需要使用数据库连接
D. read_sql 既可以使用 sql 语句读取数据库数据,也可以直接读取数据库表
(2)【多选】关于 Pandas 数据读写,下列说法正确的有 。
A. read_excel 能够读取 xls 后缀的文件
B. read_sql 能够读取数据库的数据
C. to_csv 方法能够将 DataFrame 写入 CSV
D. to_sql 方法能够将 DataFrame 写入数据库
(3)对数值型数据应用 describe 方法返回的特征不包括 。
A. 中位数 B. 标准差 C. 数目 D. 方差
(4)关于移动窗口 rolling 方法,下列说法正确的是 。
A. 接收 offset 时,对应的索引需为时间类型
B. 接收 int 时,空值不会保留
C. 接收 offset 时,空值不会保留
D. 返回 Rolling 对象
(5)关于 agg 方法,下列说法错误的是 。
A. 返回标量值和数组 B. 可接收 NumPy 函数
C. 可对分组的不同列指定作用的函数 D. 可同时接收多个函数
(6)【多选】下列关于 groupby 方法说法正确的是 。
A. groupby 能够实现分组聚合
B. groupby 方法返回的结果能够直接查看
C. groupby 是 Pandas 提供的一个用来分组的方法
D. groupby 方法是 Pandas 提供的一个用来聚合的方法
(7)使用 pivot_table 函数制作透视表用下列那个参数设置行分组键 。
A. data B. values C. columns D. index
(8)【多选】以下关于缺失值的说法中,正确的是 。
A. isnull 方法可用于计算缺失值数量
B. dropna 方法既可以删除观测记录,也可以删除特征
C. f illna 方法可用来切换缺失值
D. Pandas 库中的 interpolate 模块包含了多种插值方法
(9)以下关于 drop_duplicates 函数的有关说法中,错误的是 。
A. 对 DataFrame 和 Series 类型的数据有效
B. 仅支持单一特征的数据去重
C. 数据有重复时默认保留第一个数据
D. 该函数不会改变原始数据排列
(10)连续数据离散化的处理方法不包括 。
A. 等宽法 B. 等频法 C. 使用聚类算法 D. 使用 Apriori 算法
2.填空题
(1)read_csv 函数用于设置分隔符的参数是 。
(2)使用 方法能够一次性得出 DataFrame 所有数值型特征的非空值数目、均值、四分位数、标准差。
(3)pivot_table 函数默认的聚合函数是 。
(4)创建交叉表的函数是 。
(5)常用的哑变量处理的函数是 。
3.操作题
(1)一组数据:5,10,11,13,15,35,50,55,72,92,204,215。使用等宽法对其进
行离散化处理。
(2)对表 7-23 中的笔记本电脑数据按 CPU 进行分组,并求出每组最大主频、最小核心数
目、最低的价格,并显示在一个 DataFrame 中。
关于作者
李明江:资深大数据专家,贵州省计算机学会常务理事,黔南州大数据专家委员会委员,黔南州计算机学会会长,黔南州教育信息化建设专家库专家,黔南民族师范学院计算机与信息学院院长,全国高校大数据教育联盟理事。主持过多项省厅级科研项目,并在《计算机应用研究》《科技通报》上发表过多篇大数据分析与数据挖掘相关技术的研究论文,著有《数据挖掘的应用与实践:案例与探析》《计算机网络技术与应用》等。滑动文字样式可以作为隐藏样式的最好替代品。只要标题后多空几行,达到下方内容滑动后才能看到,就已经达到目的了。
张良均:资深大数据挖掘与分析专家、模式识别专家、AI技术专家。有10余年大数据挖掘与分析经验,擅长Python、R、Hadoop、Matlab等技术实现的数据挖掘与分析,对机器学习等AI技术驱动的数据分析也有深入研究。为电信、电力、政府、互联网、生产制造、零售、银行、生物、化工、医药等多个行业上百家大型企业提供过数据挖掘应用与咨询服务,实践经验非常丰富。华南师范大学、中南财经政法大学、广东工业大学、西安理工大学、广西科技大学、重庆交通大学、桂林电子科技大学等校外硕导。撰写了《Python数据分析与挖掘实战》《R语言数据分析与挖掘实战》《数据挖掘:实用案例分析》《Hadoop大数据分析与挖掘实战》等多部畅销书,累计销量近20万册。
本文摘自机械工业出版社《Python3智能数据分析快速入门》,经出版社授权发布。
#2019 中国大数据技术大会(BDTC)#
滴滴出行高级副总裁,云平台事业群负责人章文嵩确认出席BDTC 2019并担任大会主席。大会还将邀请更多业内顶尖大数据应用领航者,与1500+观众分享最佳案例实践。详情https://t.csdnimg.cn/f9VS