如何阻止Tabula自动删除空列?

时间:2019-05-09 18:12:24

标签: python pandas dataframe pdf tabula

我正在尝试从PDF抓取数据,以便可以重新格式化它,然后将其插入Oracle中的表中。我正在尝试使用Tabula读取PDF并将其转换为表列表,但是Tabula似乎是从表中删除列,如果这些列仅包含空值。 通常这不是问题(数据从无到有,因此我不在乎保存),但是在某些列而不是其他列上删除“ null”值会使我的代码无法实现确定哪些列是哪些。 例如,它可能来自:

0   1   2   3

x   x  n/a  x

x   x  n/a  x

x   x  n/a  x

0   1   2

x   x   x

x   x   x

x   x   x

在运行时无法知道要删除哪一列,因此我不能只将其重新插入到必要的位置。

这些列在数据中没有任何唯一标识符。 我不能只在末尾添加空列,因为绝对有必要在列中保持相同的顺序。

我已经研究过Tabula API,虽然我找到了许多方便的指南来删除空列,但是却找不到确保它们保持存在的任何方法。

dflist = tabula.read_pdf(path, pages = '14-27', multiple_tables = True)
# dflist is a list of dataframes
# dflist[0] == a single dataframe

(对格式不正确的致歉;不熟悉堆栈溢出间隔)

预期结果:

0   1   2   3

X   NaN X   X   

X   NaN X   X   

X   NaN X   NaN

实际结果:

0   1   2

X   X   X   

X   X   X   

X   X   NaN

2 个答案:

答案 0 :(得分:0)

更新:我能找到的最好的解决方案是摆弄“格子”设置,该设置确定如何在Tabula中读取表(可以在其站点上找到文档)。 不幸的是,这些设置也偏移了我PDF上的某些行,因此我无法使用它。我不得不放弃使它完全自动化的想法,现在使用一个临时表,由人工检查哪些列将被删除。

答案 1 :(得分:0)

我遇到了同样的问题,还在GitHub上查看了其他示例。我认为只要您避免使用

读取标题
pandas_options={'header': None}

并且有空列,此问题将显现。我测试了它读取标题,但是pdf中各列的标题以它们自己的方式是混乱的,因此这并不是一个选择。设置“ columns”和“ area”参数时,即使没有标题,该问题也应 静止 发生,这似乎并不正确。您可以准确地告诉它列的位置,如果它们为空,它仍然会丢弃它们。可能是表格的不足-确实没有什么可以确保他们留在现场。

我也将绝望并手动进行操作,然后我想出了一种解决方法。

因此,像OP一样,我也在读取多个表,实际上是数百个pdf页面。在我的情况下,正常的列数是9,但如果不是9,则可以预见的是8。此外,它仅在原始数据中的第9列发生过,这是某些页面上唯一的列完全空了。因此,对于列表中的数据框,只需将其固定在NaN的一列中,表格不能放在其中:

dfs_clean = list()

for df in dflist:
    if df.shape[1] != 9:
        df[8] = np.nan 
        dfs_clean.append(df)       
        continue        
    dfs_clean.append(df)

one_df = pd.concat(dfs_clean)

仅当它总是相同的可预测列(有时为空)时才起作用,因此您可以以编程方式将其替换为nans。

如果维护人员可以将此功能添加到表格中,或者告诉我们如何使用它(如果已经存在)会更好。 Python介面有一个java_options参数,也许您可​​以在其中放置一些参数。