在有了数据集之后,接下来我们就开始学习怎么把数据集的内容加载到 Python 中。虽然我们在上一个模块学过简单的读取 csv 的文件内容。
但是存在两个问题:
只能读取 csv 文件,但数据分析的数据除了可能来自 csv,也可能来自 Excel,甚至可以来自 html 的表格。
读取到的结果一般是字典列表,并不利于分析,比如虽然我们每个字典就代表一行记录,但一旦我们想拿某一列的数据的时候就会非常复杂。
Python 作为数据分析领域的头号种子选手,自然不会只有 csv 模块这样的初级工具。这个部分我们将会学习表格类型的大数据处理神器:pandas。
pandas 不仅可以从多种不同的文件格式读取数据,还有各种各样的数据处理的功能。可以说学好了pandas,就基本已经算踏上了数据分析之路。
1. 安装pandas 工具包
pip3 install pandas
安装后进行导入:
import pandas as pd
2. 使用 pandas 读取 csv 文件
pandas 模块提供了一个 read_ csv 的方法,可以直接读取 csv 文件,并返回一个 DataFrame 对象。DataFrame 对象是 pandas 模块的核心,pandas 的所有表格都是通过 DataFrame 对象来存储的,并且 DataFrame 还提供了非常多查看数据、修改数据的方法。
pandas 可以直接从一个 csv 文件中,将数据读到 Python 中,并且以DataFrame 对象的形式返回,我们拿到这个对象就可以查看其中的数据。
实战:使用pandas 获取到 tv_rating. csv 中的数据
# 使用 pandas 模块的 read_ csv 函数,读取 csn 文件。并将结果存在 df_rating 变量中
import pandas as pd
df_rating = pd.read_csv("tv_rating.csv")
# 打印 df_rating 变量
print("df_rating:")
print(df_rating)
# 打印 df_rating 变量的类型
print("df_rating type:")
print(type(df_rating))
输出:
从上面的输出中可以看到,df_rating 变量中包含了我们 csv 文件中的所有数据,并且还有形状的描述:3600 行 x 3列,这个也和我们下载的数据一致。通过打印 df_rating 的类型,可以看到 df_rating 的类型就是我们上面提到的 DataFrame。
3. 使用 pandas 读取 excel 文件
在 Python 还没有兴起之前,大量的数据分析是通过 Excel 完成的。这也造就了在很多传统行业中,还有大量的数据是保存在 Excel 中,所以读取 Excel 也是进行分析也是 Python 数据分析领域的常见任务。
Excel 的 .xls/.xlsx 文件格式是微软针对表格开发的,只能使用 Excel 来打开,比如用记事本打开往往会看到有乱码。那 Python 是怎么读取 Excel 里面的内容呢?
类似 csv 的读取,pandas 也提供了 read_excel 函数来实现读取 excel 文件中的内容,但是使用方法比 read_ csv 稍微复杂一些。
接下来我们通过一个小实战来学习 read_excel 使用。
(1)准备测试数据
我们之前做的数据都是 csv 格式的。我们现在先来制作一个简单的 excel 文件,用来测试我们后面的代码。
打开 Excel ,将第一个表格(sheet)的名字改为:基本信息,并复制添加下述内容
添加完后的 Excel 如下所示
然后,点击下面的 +号,点击新建一个表格,并命名为“绩效”,然后复制粘贴以下内容。
添加之后的 Excel 界面如下所示。
保存 Excel 到项目中,并命名为 info.xlsx。
(2)读取数据
数据准备完毕了,现在我们来读取我们刚才创建的表格。形式类似刚才的 read_ csv。
#从Excel中读取
# 使用 read_excel 函数,读取 info.xlsx 的内容并存储在 df_info 变量中
df_info = pd.read_excel("info.xlsx")
# 将 df_info 打印
print(df_info)
输出:
姓名 年龄 籍贯 部门
0 小明 22 河北 IT部
1 小亮 25 广东 IT部
2 小E 23 四川 财务部
可以看到,Excel 中的数据被成功的打印了出来,和 read_ csv 一样,read_excel 返回的也是一个 DataFrame。
不过内容虽然打印出来了,但是只打印出了第一个表格,也就是“基本信息”这个表格,我们后面添加的“绩效”表格并没有打印出来。这是 pandas 的机制导致的,read_excel 默认读取 excel 文件中的一个表格。
一个 Excel 中包含多个表格还是很常见的,如何读取更多的表格呢?我们进入下一个步骤。
(3)读取不同的表格
read_excel 比 read_ csv 复杂的地方就在于,read_excel 支持非常多的参数。比如要实现读取后面的表格,我们只需要给 read_excel 函数的 sheet_name 参数赋值即可。
# 使用 read_excel 函数读取 info.xlsx 文件里的 “绩效” 这个表格
# 并将结果存在 df_perf 变量中
df_perf = pd.read_excel("info.xlsx", sheet_name="绩效")
# 打印 df_perf 变量
print(df_perf)
姓名 绩效考核 上期考核结果
0 小明 优秀 优秀
1 小亮 良好 优秀
2 小E 良好 优秀
可以看到,这次输出的就是我们增加的“绩效”表格中的内容。
简单来说,我们可以在 read_excel 中,通过给 sheet_name 赋值来决定要加载文件哪个表格,如果不指定,pandas 则默认加载第一个表格。
(4)选择性读取
有时候, excel 文件的数据很多,全部加载到 Python 中可能会卡,而且有时候我们只对其中某几列感兴趣,全部加载显示也不容易看。read_excel 提供了 usecols 参数,可以指定要加载哪几列。
举个例子,刚才的“绩效”表格,我们对上期考核结果不感兴趣,只想加载姓名和绩效考核这两列的内容。那我们可以这么写:
# 使用 read_excel 函数读取 info.xlsx 中的 绩效 表格
# 并只读取 A B两行,并将结果存到 df_perf1 变量中
df_perf1 = pd.read_excel("info.xlsx", sheet_name="绩效", usecols="A,B")
# 打印 df_perf1 变量
print(df_perf1)
执行之后,输出结果可以看到,我们已经成功实现了只加载前两列的内容。
姓名 绩效考核
0 小明 优秀
1 小亮 良好
2 小E 良好
在上面的代码里,我们通过字母 A 和 B 指定了加载第一列和第二列。字母和列的对应关系其实就是 Excel 里面的对应关系。如下图所示。
至此,我们学习完了基本的读取 excel 文件的操作。
4. 使用 pandas 读取 html 文件
有的时候数据并不是整理好的 csv 表格或者 Excel 表格,而是以网页中的表格的形式存在,最常见的就是各类股票财经网站,比如像同花顺的股票涨跌幅数据中心:http://data.10jqka.com.cn/market/zdfph/。
或者像招行银行的外汇行情页面,如下所示。
如果我们希望将这些网页中的表格“导入”到 Python 进行处理,那自然也是可以的。根据我们上一个部分学习的爬虫技术,我们只需要将这个页面的 html 下载下来,然后用 BeautifulSoup 分析表格的标签结构,然后把内容一行一行的提取出来,再一步一步拆分成列。
做是可以做,但只听这个流程,只看这个复杂的页面,都让人觉得工作量很大。而对于提取网页中的表格,其实存在一个非常简单的方法:使用强大的 pandas。
和 read_ csv、read_excel 类似,pandas 也提供了一个 read_html 的方法,来智能的提取网页中的所有表格,并以 DataFrame 列表的形式返回,一个表格对应一个 DataFrame。
我们还是通过一个简单的小例子来学习 read_html 方法的使用。我们以刚才举的招商银行外汇行情的页面为例,尝试在 Python 中加载该网页中表格的数据。
(1)准备网页
首先要做的第一件事,就是要拿到网页的内容。
import urllib3
def download_content(url):
#创建一个PoolManager 对象,命名为http
http = urllib3.PoolManager()
#调用 http 对象的 request 方法,第一个参数传一个字符串 "GET"
# 第二个参数则是要下载的网址,也就是我们的url变量
# request方法会返回一个HTTPResponse类的对象,我们命名为response
response = http.request("GET",url)
#获取 response 对象的 data 属性,存储在变量 response_data 中
response_data = response.data
#调用response_data对象的decode方法,获得网页的内容,存储在html_content变量中
html_content = response_data.decode()
return html_content
html_content = download_content("http://fx.cmbchina.com/Hq/")
执行上述代码之后,网页内容就已经存储在 html_content 变量中。
(2)读取数据
在准备好了网页的内容之后,我们就可以调用 read_html 函数来获取表格了。
# 调用read_html函数,传入网页的内容,并将结果存储在cmb_table_list中
# read_html返回的是一个 DataFrame 的list
cmb_table_list = pd.read_html(html_content)
#打印list的长度,看看抽取出了几个表格
print(len(cmb_table_list))
执行代码,输出结果为 2。这说明找到了两个表格,但我们回过头去看网页,主体应该只有一个表格。这种情况还是比较常见的,多半是网页在一些不是表格的元素也使用了表格的标签,导致 pandas 识别多了一个,遇到这样的情况我们只需要逐一查看返回的 DataFrame 列表,找到我们要的即可。
现在我们来从列表中找出我们要的表格,首先查看第一个 DataFrame。
#查看第一个 DataFrame
print(cmb_table_list[0])
0 1
0 NaN NaN
1 当前日期:2022年09月23日 当前日期:2022年09月23日
很明显,这不是我们需要的表格,接下来来看第二个
print(cmb_table_list[1])
执行之后,输出如下:
很明显,这个就是我们要的表格了。可以看到我们在招行官网上看到的汇率表格已经完整的被加载到了 pandas 的 DataFrame 中,并且能够以表格的形式打印出来。
如果我们用 BeautifulSoup 来解析这个网页然后提取出表格的内容,恐怕代码都要写大几十行,而 pandas 却一个函数搞定了。