我正在使用python库Camelot来解析多个PDF,并提取这些PDF文件中的所有表。代码的第一行返回以列表格式从pdf抓取的所有表。我正在寻找特别是其中具有唯一字符串的表。幸运的是,该字符串是该表唯一的,因此从理论上讲,我可以使用它来隔离我要获取的表。
这些pdf或多或少都是以相同的格式创建的,但是有足够的差异,我不能只对所需的表进行静态调用。例如,有时我想要的表将是抓取的第一个表,有时将是第三个。因此,我需要编写一些代码以能够动态选择表。
我脑海中的工作流程在逻辑上是这样的:
在for循环之前创建一个空列表以将表附加到该列表。调用for循环并遍历Camelot代码输出的列表中的每个表。如果表中没有我要查找的字符串,请删除该表中的所有数据,然后将空数据框附加到空列表中。如果它确实包含我要查找的字符串,请将其附加到空白列表中,而不删除任何内容。
是否有更好的方法来解决此问题?我肯定那里有。
我已经将到目前为止已完成的工作放到了代码中。我很努力地将条件语句放在一起以删除字符串中存在的数据帧的所有行。我发现了很多示例,如果存在字符串,则删除列和行,但对于整个数据帧则没有任何显示
import camelot
import pandas as pd
#this creates a list of all the tables that Camelot scrapes from the pdf
tables = camelot.read_pdf('pdffile', flavor ='stream', pages = '1-end')
#empty list to append the tables to
elist = []
for t in tables:
dftemp = t.df
#my attempt at dropping all the value if the unique value isnt found. THIS DOESNT WORK
dftemp[dftemp.values != "Unique Value", dftemp.iloc[0:0]]
#append to the list
elist.append(dftemp)
#combine all the dataframes in the list into one dataframe
dfcombined = pd.concat(elist)
答案 0 :(得分:1)
您可以在dftemp.values返回的numpy数组上使用'in'运算符 link
for t in tables:
dftemp = t.df
#my attempt
if "Unique Value" in dftemp.values:
#append to the list
elist.append(dftemp)
答案 1 :(得分:1)
您可以在一行中完成该操作:
dfcombined = pd.concat([t.df if "Unique Value" in t.df.values else pd.DataFrame() for t in tables ])