文章转载自公众号 林骥 , 作者 林骥
0. 序言
整理的意思,是整顿使之有条理,目标是让零散杂乱的数据变得井然有序。
许多数据分析师都需要花费大量的时间来整理数据,有可能花在整理数据上的时间,甚至超过分析数据的时间。
做数据分析工作,表面是在制作数据报表、提交分析报告,背后其实是你数据分析思维的体现。
如果借用「前台、中台、后台」的概念来解释的话,那么展现数据和总结报告属于「前台」,处理数据和分析数据属于「中台」,而明确目标和应用思维就属于「后台」。

前台直接面向客户,是实现价值的重要途径。夸前台,通常会说“真漂亮”。
中台是为前台而生,为了更好地服务前台,它是前台与后台之间的桥梁,起着非常重要的作用,中台具有灵活调整、随需应变的特征,从而更好地适应不断变化的环境。夸中台,通常会说“有能力”。
后台支撑着整个数据分析体系,它是数据分析的基石。夸后台,通常会说“好强大”。
前台仅仅是冰山一角,水下的中台和后台,其实隐藏着无数的奥秘。
1. 数据准备
首先,为了演示整理数据的方法,我们从 www.gapminder.org/data 下载 2 个数据文件,分别是世界各国的人口数量、预期寿命,保存到本地当前目录下的 data 文件夹中。
其次,为了便于理解,我们选取其中几个国家 2018 年的数据,第 1 个表是中国和印度 2018 年的人口数量。

第 2 个表是中国、日本和俄罗斯 2018 年的预期寿命。

接下来,我们将用 Python 对这两个表进行整理。需要说明的是,我们无法对整理数据的方法进行面面俱到的讲解,这里只是挑选了几个我认为比较有代表性的方法,如下图所示。

2. 外连接
本文中「连接」的概念,类似于数据库查询语言 SQL 中的 join 功能。
「外连接」是指经过整理后,得到两个表的所有行,相当于两个表的并集。
使用 Pandas 中的 merge() 函数,指定 how 参数的值为 ‘outer’,我们可以实现两个表的外连接,其中参数 on 用于指定连接的列名,作为两个表关联的键,缺失值用 NaN 代替。

3. 内连接
「内连接」相当于两个表的交集,只返回两个表相互匹配的数据。
当不指定 merge() 函数的 how 参数时,默认就是内连接。如果不指定 on 参数,那么默认以两个表共同的列名作为连接键。

4. 左连接和右连接
「左连接」是以左边表为主表,即使有些记录在右边表中不存在,左边表中的信息也都全部显示出来,右边表中不符合匹配条件的值用 NaN 代替。
如果 merge() 函数指定 how 参数的值为 ‘left’,那么实现两个表的左连接。

「右连接」与「左连接」是类似的,只是交换了左右的位置而已。
当 merge() 函数指定 how 参数的值为 ‘right’ 时,实现两个表的右连接。

5. 交叉连接
两个表的「交叉连接」,是指将第 1 个表中的所有行与第 2 个表中的所有行两两相连,返回的行数等于两个表的行数相乘,在数学上称为笛卡尔积。
在 Python 中,实现交叉连接可以细分为 3 个小步骤:
(1)用 assign() 函数增加 key 列;(2)用 merge() 函数进行连接;(3)删掉 key 列。
利用下面的代码,就能完成交叉连接的操作。

因为两个表都有「国家」列,所以在返回的结果中,列名自动增加了 _x 和 _y 的后缀。
6. 联合拼接
「联合拼接」,是指将两个表直接拼接在一起,不排除重复数据。对于列名相同的列,两个表直接上下相连;如果列名不同,那么分成不同的列进行拼接。
使用 Pandas 中的 concat() 函数,可以将两个表进行联合拼接,其中「国家」列是上下拼接,其他列由于列名不同,所以被拼接为多列,缺失值用 NaN 表示。

另外,append() 函数也可以实现类似的拼接功能。为了不增加记忆负担,这里就略过不说了,感兴趣的朋友可以自行搜索相关帮助文档。
在使用 Python 的过程中,我们可能会发现,同一个问题,往往能找到多种不同的解决方案。
比如说,本文介绍的方法,其实都可以用 pandasql 来实现,也就是采用写 SQL 语句的方式。
在学习的初期,我们不必纠结于应该采用哪种方法,以最快速地解决实际问题为首要目的,先完成任务,然后再逐渐完善,不断地丰富自己的知识体系,就能发现更加高效的解决方案,这正是从入门到精通、从新手到高手的一个过程。
7. 小结
本文主要使用 Pandas 中的 merge() 和 concat() 两个函数,对两个简单的表格数据,从不同的角度进行合并整理。通常每个函数都有若干个参数,在做数据分析的实际工作中,可以根据需要,进行调用和指定。
下面这张思维导图,能够帮助我们理清思路,加深理解和记忆。

到目前为止,数据分析的前期准备工作已经基本完成,接下来的文章,我们将开始分析数据。
随着数据变得越来越丰富,数据变成一种核心的资源,利用数据分析的技术,能够解决越来越多的实际问题。
你无法无所不知,因为世界总是在不断变化,但你今天的工作内容,将成为明天的工作经验。要让知识和现实之间产生联接,不断完善自己的知识体系。
如果你掌握了数据分析的技术,就可以在数据中洞察先机,发现业务的盲点和亮点,从而有能力做出更好的决策。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。