上一期我们使用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包,该包有非常强大的数据清洗功能,感兴趣的读者可以阅读这两篇文章:
结果如下:
注意,这个只是含有所有哑变量的数据集,并不包含其他连续变量,如id,age变量。故还要通过cbind函数将两个数据集合并起来。
结果如下:
删除某个哑
四、连续变量的分段
最后,再来看一个知识点,那就是需要把连续变量进行分段处理,如年龄需要分成未成年、青年、中年和老年;收入需要分成低收入群体、中等收入群体和高收入群体,数据中类似这样的问题还是蛮多的,如何把这些连续数据进行分段处理呢?看看Python是如何达到目的的:
这里我们随机生成一列数据表示年龄
假如18岁以下为未成年;18~45岁为青年;45~60岁为中年;60岁以上为老年,接下来就根据这些阈值把年龄分为4段。
结果如下:
图中right参数设置为False,表示分段的数据区间不包含上限。
原始年龄数据如下,查看与分段的年龄组对比:
同样的问题,看看R语言是如何解决的:
结果如下:
虽然cut2函数把数据集切割成了4段,但返回的结果是区间表示,我们还需要通过因子函数,再将这些区间表示转换成明确的含义。
今天我们的内容就介绍到这边,欢迎大家交流与拍砖。下期我们来分享一些Python的可视化方面的知识点。
每天进步一点点2015
学习与分享,取长补短,关注小号!
长按识别二维码 马上关注