type
status
date
slug
summary
tags
category
icon
password
你们都是虫子。 ——《三体》
今年对于新的一年真是有特殊的感受,因为这真正意义上是**「新的一年」**。
从放假这几天能感受出,曾经那些烟火气回来了。希望我和小气球在新的一年,也能越来越好,有新的收获。
新年第一篇,来点干货学习吧,毕竟学无止境呀。

pandas 是目前最流行的 Python 数据分析库(重复讲了非常多次了,但是还是要继续强调一下)。
它可以直接从各种外部来源读取数据,包括从 CSV、 Excel 表格、 JSON 文件、 SQL 数据库,甚至从剪贴板读取。在前面的教程中也有部分涉及,有兴趣的可以翻看之前的文章。
但是**「目前pandas还没有直接读取 PDF 文件中的数据的方法」。**
值得庆幸的是,tabula-py 库可以在 PDF 中以 DataFrames 的形式读取这些表。
接下来就让我们来实际操作一下。

在开始之前,如果还没有安装tabula-py库,可以使用如下代码进行安装:
我们将以一本名为“pandas cookbook”的书(Ted Petrou在2017年出版)中提取一个表。PDF 的图像内容如下:

Tabula-py 能自动读取通过 read _ pdf 函数传递过来的页面上的所有表。我们所要做的就是给它提供 PDF 文档的文件路径和要提取的页面。
可以看到,输入结果表示读取到了一个内容,目前为止输出正常。
我们再试着把pandas读取的内容打印出来看看是不是正常显示:

可以看到,表头这边出了一点错误,需要我们后续调整一下。
对于这个PDF,我们想要的是提取出正确的表格,其中包含格式、副本、收入、版税四列。而实际上,Tabula 提取的内容比预计的多,导致表格并没有提取的非常好。
我们可以使用pandas来清理数据,但 tabula-py 为我们提供了参数来定义整个表本身的边界和列的定位。相对 _ area 和相对 _ column 参数被设置为 True,这允许我们提供区域和列参数的边界,作为页面的百分比,而不是点坐标。在我看来,使用相对页面百分比更容易定义边界。传递区域列一个由顶部、左部、底部和右部组成的四项列表。它们表示表相对于页的边界。列的三项列表表示分隔四列的垂直线。让我们重新读入数据并输出结果 DataFrame。

这个提取看起来更好,几乎正是我们想要的。让我们检查每个列的数据类型,以了解哪些列需要更多处理。

方便地,成功地将“副本”列转换为整数。“收入”和“使用费”列作为字符串读入。我们现在必须转向熊猫将这些列转换为浮动。为此,我们使用正则表达式将任何美元符号、逗号和空格替换为空格。

在本教程中,我们将自定义输入传递到 tabula-py 的 read _ PDF 函数中,以提取作为熊猫 DataFrame 的 PDF 中的表。然后我们清理了结果,熊猫能够使用正则表达式替换字符。Tabula-py 还有几个选项可用于定制提取过程。