如何拆分列表多组数据并追加至Pandas DataFrame下方(Python)
问题描述
我用Python代码从PDF中提取采购订单号(PO)、Item、交货日期(Data)和文件名,但单个PDF包含多组数据时,生成的列表是嵌套结构,导入Pandas DataFrame后单元格会包含多组数据。需要拆分这些嵌套数据,按顺序追加到对应行下方,让每组数据单独占一行。
原代码如下:
lista_Pedido = [] lista_Data = [] lista_Item = [] nome_arquivo = [] for f in os.listdir(): col_3 = [f] nome_arquivo.append(col_3) reader = PdfReader(f) page = reader.pages[0] pdf_atual = page.extract_text(f) col_1 = re.findall(r'\w+(?<=PO: 45)\d+',pdf_atual) lista_Pedido.append(col_1) col_12= re.findall(r'(?<=Item )\d+',pdf_atual) lista_Item.append(col_12) col_2 = re.findall(r'[?<=(Date of delivery: )|?<=(Data de fornecimento: )]\s+\d+/+\d+/+\d+',pdf_atual) lista_Data.append(col_2) df = pd.DataFrame(data=(), columns=['Pedido','Item','Data']) df['Item'] = (lista_Item) df['Data'] = (lista_Data) df['arquivo'] = (nome_arquivo)
解决方案
修改后的代码会逐个处理每个PDF内的多组数据,确保每组PO、Item、Data和文件名对应单独一行:
import os import re import pandas as pd from pdfreader import PdfReader # 初始化存储单条数据的空列表 lista_Pedido = [] lista_Data = [] lista_Item = [] nome_arquivo = [] for f in os.listdir(): # 仅处理PDF文件,避免非PDF文件干扰 if not f.endswith('.pdf'): continue reader = PdfReader(f) page = reader.pages[0] pdf_atual = page.extract_text() # 提取当前PDF中的所有目标数据 pos = re.findall(r'\w+(?<=PO: 45)\d+', pdf_atual) items = re.findall(r'(?<=Item )\d+', pdf_atual) datas = re.findall(r'(?<=Date of delivery: |Data de fornecimento: )\s+\d+/\d+/\d+', pdf_atual) # 补全长度不一致的列表,避免数据错位 max_len = max(len(pos), len(items), len(datas)) pos += [''] * (max_len - len(pos)) items += [''] * (max_len - len(items)) datas += [''] * (max_len - len(datas)) # 逐个追加数据,每组数据对应一行 for po, item, data in zip(pos, items, datas): lista_Pedido.append(po.strip()) lista_Item.append(item.strip()) lista_Data.append(data.strip()) nome_arquivo.append(f) # 生成最终DataFrame df = pd.DataFrame({ 'Pedido': lista_Pedido, 'Item': lista_Item, 'Data': lista_Data, 'arquivo': nome_arquivo })
关键改动说明
- 新增PDF文件过滤:只处理
.pdf后缀文件,避免遍历到非PDF文件引发错误 - 拆分嵌套数据:不再将单个PDF的多组数据作为嵌套列表追加,而是通过
zip逐个取出每组数据,分别追加到总列表,确保每组数据单独占一行 - 数据对齐处理:用
max_len补全长度不一致的列表,避免zip截断数据,保证PO、Item、Data一一对应 - 清理冗余空格:对提取的字符串执行
strip()操作,去除不必要的空白字符
内容的提问来源于stack exchange,提问作者ph_eng
相关产品推荐
相关产品推荐

