数据分析6 -- 使用pandas对多种文件类型进行处理

在有了数据集之后,接下来我们就开始学习怎么把数据集的内容加载到 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 却一个函数搞定了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值