【问题标题】:Optimize string split to get a pandas dataframe优化字符串拆分以获得 pandas 数据框
【发布时间】:2022-11-17 18:03:32
【问题描述】:

我正在使用 databricks 中的 python 使用正则表达式从大型 pdf 文件中提取数据。该数据采用长字符串形式,我正在使用字符串拆分函数将其转换为熊猫数据框,因为我希望最终数据为 csv 文件。但是在执行 line.split 命令时,命令运行大约需要 5 个小时,我正在寻找优化它的方法。我是 python 的新手,我不确定应该查看代码的哪一部分以减少运行命令的时间。

for pdf in os.listdir(data_directory):
  # creating an object
  file = open(data_directory + pdf, 'rb')

  # creating file reader object
  fileReader = PyPDF2.PdfFileReader(file)

  num_pages = fileReader.numPages 
  #print("total pages = " + str(num_pages))
  extracted_string = "start of file"
  current_page = 0 
  while current_page < num_pages:
    #print("adding page " + str(current_page) + " to the file")
    extracted_string += (fileReader.getPage(current_page).extract_text())
    current_page = current_page + 1

  regex_date = "\d{2}\/\d{2}\/\d{4}[^\n]*"

  table_lines = re.findall(regex_date, extracted_string)

上面的代码是从PDF中获取数据

#create dataframe out of extracted string and load into a single dataframe  
for line in table_lines:
    df = pd.DataFrame([x.split(' ') for x in line.split('\n')])
    df.rename(columns={0: 'date_of_import', 1: 'entry_num', 2: 'warehouse_code_num', 3: 'declarant_ref_num', 4: 'declarant_EORI_num', 5: 'VAT_due'}, inplace=True)
    table = pd.concat([table,df],sort= False)

这部分代码占用了大量时间。我尝试了不同的方法从这些数据中获取数据框,但上面的方法对我来说效果最好。我正在寻找更快的方式来运行这段代码。

https://drive.google.com/file/d/1ew3Fw1IjeToBA-KMbTTD_hIINiQm0Bkg/view?usp=share_linkpdf文件供参考

【问题讨论】:

  • 我对你的数据框的结构有任何想法,但每次处理一行时实例化一个新的数据框对我来说很奇怪!
  • 这个列的定义会改变吗? {0: 'date_of_import', 1: 'entry_num', 2: 'warehouse_code_num', 3: 'declarant_ref_num', 4: 'declarant_EORI_num', 5: 'VAT_due'} 请发布示例:数据框的第一行。

标签: python


【解决方案1】:

您的代码中有 2 个直接优化步骤。

  1. 如果它们被多次使用,请预编译正则表达式。它在这里可能相关也可能不相关,因为我无法猜测table_lines = re.findall(regex_date, extracted_string) 被执行了多少次。但这通常更有效:

     # before any loop
     regex_date = re.compile("d{2}/d{2}/d{4}[^
    ]*")
     ...
         # inside the loop
         table_lines = regex_date.findall(extracted_string)
    
  2. 不要重复附加到数据框。数据框是一个相当复杂的容器,追加行是一项代价高昂的操作。通常先构建一个 Python 容器(列表或字典)然后将其作为一个整体转换为数据框会更有效率

     data = [[x.split(' ') for x in line.split('
    ')] for line in table_lines]
     table = pd.DataFrame(data, columns = ['date_of_import', 'entry_num',
                                           'warehouse_code_num', 'declarant_ref_num',
                                           'declarant_EORI_num', 'VAT_due'])
    

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多