查看原文
其他

从零开始学Python【9】--pandas(数据框部分04)

2017-08-30 刘顺祥 每天进步一点点2015

上一期我们使用pandas模块实现频数统计、缺失值处理、数据映射和数据汇总 4个知识点,这期我们再来聊聊关于pandas如何实现数据合并 、数据连接 、创建哑变量和连续数值的区间化的操作。前两个操作在数据库中是非常常用的,即将多个数据集纵向合并和横向的扩展;后两个操作在数据建模中会经常用到,即离散变量的哑变量化处理和连续变量的分段处理。


一、数据集的纵向合并

如果你手中有多张数据结构一致的excel表格,你需要将这些表格合并到一起,你会怎么做?复制粘贴?是不是太慢了,这里教你使用Python完成数据的批量合并。

例如,我的D盘中有这些个结构一致的excel表格:

可以通过如下的Python代码完成数据的堆叠

注意,pd.concat函数的第一个参数一定要是一个可迭代对象。故在代码中对dataframe初始化为列表结构。

结果如下:


我们看看R语言的环境下,是如何完成数据集的纵向合并:

结果如下:


二、数据集的横向扩展

如果你所需的数据集来自于多张表,而这些表之间存在一些公共的字段用于观测行的匹配,换句话说,你需要在excel使用vlookup这样的函数完成数据的连接。要想实现该功能,在Python中应该如何实现呢?

先来看一下需要join的数据长啥样:

接下来,借助于pandas中merge函数完成两个数据集的连接,即将economy_info表中的字段合并到user_info表中,形成一张宽表。


我们先来看一下merge函数的几个重要的参数:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False)

left,right:为需要连接的两张表;
how:默认对两张表进行内连,'right','left'为右连和左连,一般inner和left使用最多;
on:指定关连两张表的公共字段;
left_on,right_on:指定left表和right表中需要关连的字段;
left_index,right_index:指定left表和right表中需要关连的行索引

结果如下:

如果你的两张表有公共字段,而且字段名称完全一致,merge函数会自动查询这些字段,并以这些字段作为连接的依据。如果两张表中含公共字段,但名称不一致,如Id与id,这个时候就需要left_on和right_on两个参数的使用了。

结果如下:

发现表中含有两个id,这个时候需要你手工再删除一下,可以通过drop函数删除其中一个变量。关于变量的删除你可以参考这篇文章:

从零开始学Python【7】--pandas(数据框部分02)


R语言也同样可以完成这部分工作,只需要借助于dplyr包即可,具体操作如下:

结果如下:


三、离散变量的哑变量处理

在建模过程中,往往会有一些离散变量,如学历、收入等级,用户会员等级。这些变量直接放入到模型中(如回归模型)是有问题的(即使你已经用1,2,3...等数据表示),为解决这个问题,我们通常是将这些变量进行哑变量处理。如果离散变量有N种水平,就需要构造N-1个变量,每一个变量均用0和1的值来表示。那这样的0-1编码,如何使用Python来实现呢?如果你使用了pandas模块中的get_dummies函数,问题就会显得非常容易。下面我们举例说明:

该数据集中的gender变量和level变量都属于离散变量,需要将这两个变量进行哑变量处理。

结果如下:

是不是很方便。千万记得,如果你的变量进行了哑变量处理,建模时要记得删除原离散变量中的某一个水平,如性别中删除gender_F,等级中删除level_V1。删除的变量,就表示性别中,以女性(F)为参照组;等级中,以V1为参照组。如下是变量的删除:


在R语言中,也有与此功能一致的哑变量处理函数(dummyVars),该函数的调用需要下载caret包,该包有非常强大的数据清洗功能,感兴趣的读者可以阅读这两篇文章:

教你使用caret包(一)--数据预处理

借助caret包实现特征选择的工作

结果如下:

注意,这个只是含有所有哑变量的数据集,并不包含其他连续变量,如id,age变量。故还要通过cbind函数将两个数据集合并起来。

结果如下:

删除某个哑变量


四、连续变量的分段

最后,再来看一个知识点,那就是需要把连续变量进行分段处理,如年龄需要分成未成年、青年、中年和老年;收入需要分成低收入群体、中等收入群体和高收入群体,数据中类似这样的问题还是蛮多的,如何把这些连续数据进行分段处理呢?看看Python是如何达到目的的:


这里我们随机生成一列数据表示年龄

假如18岁以下为未成年;18~45岁为青年;45~60岁为中年;60岁以上为老年,接下来就根据这些阈值把年龄分为4段。

结果如下:

图中right参数设置为False,表示分段的数据区间不包含上限

原始年龄数据如下,查看与分段的年龄组对比:

同样的问题,看看R语言是如何解决的:

结果如下:

虽然cut2函数把数据集切割成了4段,但返回的结果是区间表示,我们还需要通过因子函数,再将这些区间表示转换成明确的含义。


今天我们的内容就介绍到这边,欢迎大家交流与拍砖。下期我们来分享一些Python的可视化方面的知识点。


往期Python学习系列:

从零开始学Python【8】--pandas(数据框部分03)

从零开始学Python【7】--pandas(数据框部分02)

从零开始学Python【6】--pandas(数据框部分01)

从零开始学Python【4】--pandas(序列部分)

从零开始学Python【4】--numpy

从零开始学Python【3】--控制流与自定义函数

从零开始学Python--数值计算及正则表达式

从零开始学Python--数据类型及结构


每天进步一点点2015

学习与分享,取长补短,关注小号!


长按识别二维码 马上关注



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存