如何利用Python快速进行数据整理和数据分析

数据整理主要是把杂乱无章的数据通过整理变得井然有序。

在数据分析行业里面大部分数据分析师需要花费大量时间来进行数据整理,可能会超过分析数据的时间。

我们在做数据分析工作的时候,前台展示的都是制表数据报表、数据分析结果报告等,都是通过数据分析的体现。

前台数据:主要是展现数据和通过数据分析的总结报告。

中间数据:通过脏数据处理,再进行数据整理。

后台数据:后台主要支撑整个数据体系,是前台数据和中间数据的基石。

1. 前期数据准备

我们这次数据主要整理 2 个数据文件,分别为世界各国的人口数量、预期寿命,文件下载后保存再本地目录date文件加中,为了便于大家的理解,我抽取了2个国家的数据,分别为中国和印度 2018 年的人口数量。

import numpy as np
import pandas as pd

#第 1 个表是中国和印度 2018 年的人口数量。
population_total = pd.read_excel(
    'D:\date\population_total.xlsx')

df1 = population_total[['country', 2018]].query(
    'country in ("China", "India")')

df1.columns = ['国家', '2018年人口数量']

df1

# Out[1] 输出结果
	国家    2018年人口数量
35	China	1420000000
76	India	1350000000
# 第 2 个表是中国、日本和俄罗斯 2018 年的预期寿命。
life_expectancy_years = pd.read_excel(
    'D:\date\life_expectancy_years.xlsx')

df2 = life_expectancy_years[['country', 2018]].query(
    'country in ("China","Japan","Russia")')

df2.columns = ['国家', '2018年预期寿命']

df2

# Out[2] 输出结果
	国家    2018年预期寿命
35	China	76.9
83	Japan	84.2
137	Russia	71.1

我们准备用python对这两个表进行分析,这次我们主要挑选比较有代表性的数据进行讲解,如下图:

2. 外连接

# 2 外连接
df1.merge(df2, how='outer', on='国家')

# Out[3] 输出结果
        国家	2018年人口数量	2018年预期寿命
0	China	1.420000e+09	76.9
1	India	1.350000e+09	NaN
2	Japan	NaN	        84.2
3	Russia	NaN	        71.1

简单描述下「连接」的概念,python连接和SQL数据库中的join 比较类似。

外连接:主要是经过数据整理后,得到A表和B表所有行,相当与两个表并集。

我们用Pandas 中 merge() 函数,指定参数 how为 'outer',这样我们可以实现两表外连接,参数 on 用于指定连接列名,作为两个表关联的键,缺失值用 NaN 代替。

3. 内连接

# 3 内连接
df1.merge(df2)

# Out[4] 输出结果
        国家	2018年人口数量	2018年预期寿命
0	China	1420000000	76.9

内连接:类似于两表交集,返回A表和B表相互匹配数据。
我们不指定 merge() 函数 how 参数时,默认是内连接,我们不指定on参数,默认以两表共同列名作为连接键。

4. 左连接和右连接

# 4 左连接
df1.merge(df2, how='left')

# Out[5] 输出结果
        国家	2018年人口数量	2018年预期寿命
0	China	1420000000	76.9
1	India	1350000000	NaN

左连接:以左边的表为主表,记录在右边表如果不存在,左边表数据也会显示,右边表中不符合匹配条件的值用 NaN 代替。
merge() 函数指定 how 参数值为 'left',会实现两个表的左连接。

# 5 右连接
df1.merge(df2, how='right')

# Out[6] 输出结果
        国家	2018年人口数量	2018年预期寿命
0	China	1.420000e+09	76.9
1	Japan	NaN	        84.2
2	Russia	NaN	        71.1

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

5. 交叉连接

# 6 交叉连接
df1.assign(key=1).merge(
    df2.assign(key=1), on='key').drop('key', 1)

# Out[7] 输出结果
        国家_x	2018年人口数量	国家_y	2018年预期寿命
0	China	1420000000	China	76.9
1	China	1420000000	Japan	84.2
2	China	1420000000	Russia	71.1
3	India	1350000000	China	76.9
4	India	1350000000	Japan	84.2
5	India	1350000000	Russia	71.1

两表交叉连接,主要指第1个表中所有行与第2个表中所有行两两相连,返回行数等于两个表的行数相乘,在数学上称为笛卡尔积。
我们在python中,交叉连接主要分为下面3个步骤:

  • assign() 函数增加 key 列
  • merge() 函数进行连接
  • 删掉 key 列

我们用以下代码可以完成交叉连接的操作。

主要是两个表都有国家列,因为在返回过程中,列名程自动增加 _x 与 _y 后缀。

6. 联合拼接

# 7 联合拼接
pd.concat([df1, df2], sort=False)

# Out[8] 输出结果
       国家    2018年人口数量 2018年预期寿命
35    China    1.420000e+09     NaN
76    India    1.350000e+09     NaN
35    China    NaN              76.9
83    Japan    NaN              842
137  Russia    NaN              71.1

联合拼接:指的是将两个表直接拼接在一起,不排除重复数据,而对于列名称相同列,两个表直接上下相连,列名不同不同,可分为不同列进行拼接。

在使用Pandas 中 concat() 函数时,可将A表和B表进行联合拼接,国家列上下拼接,其他列列名不同,被拼接为多列,缺失值用 NaN 表示。

此外,append() 函数也可实现相似拼接。时间问题,我这就略过了,不懂的可以搜索相关文档进行查看。

通过熟练掌握后,会发现一个有趣的问题,我们可以通过不同的方式来解决各种不同的问题。

其实也有另外一种方法,用pandasql ,采用写 SQL 语句也可以实现。

在入门学习阶段,其实不必纠结用哪种方法,首要任务时能快速的解决问题,后续逐步完善,不断丰富知识体系,高效解决问题,这就是新手入门到高手循序渐进的过程。

准备了一张思维导图来帮助大家来理清知识脉络,加强记忆。

总结:

这篇文章主要讲解Pandas 中 merge() 与 concat() 2个函数,对A表和B表数据,用不同的方法整理合并。一般若干函数有若干参数,在工作中做数据分析,根据调用和指定来协调。

示例数据文件下载:

当前内容只有登录了才能查看,如果您已经注册,请登录
本文由 学习链 作者:学习链 发表,其版权均为 学习链 所有,文章内容系作者个人观点,不代表 学习链 对观点赞同或支持,未经许可,禁止转载,题图来自Unsplash,基于CC0协议。

发表评论