如何拆分Pandas DataFrame中PaddleOCR返回的含置信度文本列?
拆分PaddleOCR返回的元组格式文本与置信度
问题情况
我用PaddleOCR识别图片后得到的DataFrame中,text列是元组格式,每个元素包含识别文本和对应的置信度。尝试用字符串方法(如str.split、lstrip)拆分失败,若不拆分,后续文本清洗会把括号去掉,导致文本和置信度混淆,影响数据处理。
现有代码:
from tqdm import tqdm import os import cv2 import re imgPaths = glob('C:/Users/23573/Desktop/img/*.jpg') dfs = [] for imgPath in tqdm(imgPaths,desc='Receipt'): _, filename = os.path.split(imgPath) ocr = PaddleOCR(lang='en') result = ocr.ocr(imgPath) img_df = pd.DataFrame(result, columns=['bbox','text']) print(img_df['text']) img_df['img_id'] = filename paddleocr_df = pd.concat(dfs)
当前text列数据格式:
ID Text 0 (7-Eleven Malaysia, 0.9709457) 1 (Sdn.Bhd., 0.97443557) 2 (ELEVEn, 0.9140763) 3 (LevelA,Podfum BfockPla, 0.88208693) 4 (No.12Jalan lmbi.55100Kuaia Lumpur, 0.9308618) 5 (#0463 Tmn Me]ur Ampang SEL, 0.94200194) 6 (Tel No.:60321142463, 0.9128232) 7 (WELCOME TO 7-ELEVEN, 0.9357082) 8 (18/04/202121:28RCPT01-288319, 0.97587883) 9 (Staff Name: DASHATARAN A/L RAJAM, 0.9589798) 10 (Coke Vanilla500ml, 0.98303896) 11 (3.20, 0.9908478)
未拆分直接清洗的错误结果:
TEXT 7elevenmalaysia09528224 sdnbhd12009405007 eleven0941575
期望结果:
ID TEXT conf 0 7-Eleven Malaysia 0.9709457 1 Sdn.Bhd. 0.97443557 2 ELEVEn 0.9140763
解决方案
因为text列存储的是元组对象,不是字符串,直接提取元组的两个元素即可,不需要用字符串处理方法。
方法一:构建DataFrame时直接拆分(推荐)
在生成DataFrame阶段就拆分元组,一步到位,同时补上原代码中遗漏的dfs.append(img_df)(否则合并后会得到空DataFrame):
from tqdm import tqdm import os import pandas as pd from paddleocr import PaddleOCR import glob imgPaths = glob('C:/Users/23573/Desktop/img/*.jpg') dfs = [] for imgPath in tqdm(imgPaths,desc='Receipt'): _, filename = os.path.split(imgPath) ocr = PaddleOCR(lang='en') result = ocr.ocr(imgPath) # 遍历OCR结果,拆分每个条目里的文本与置信度元组 processed_data = [[item[0], item[1][0], item[1][1]] for item in result] # 直接生成包含bbox、TEXT、conf的DataFrame img_df = pd.DataFrame(processed_data, columns=['bbox','TEXT','conf']) img_df['img_id'] = filename dfs.append(img_df) # 将当前图片的DataFrame加入列表 paddleocr_df = pd.concat(dfs)
方法二:对已生成的DataFrame拆分
如果已经得到了包含元组text列的DataFrame,可用apply提取元组元素:
# 从元组中提取文本和置信度 paddleocr_df['TEXT'] = paddleocr_df['text'].apply(lambda x: x[0]) paddleocr_df['conf'] = paddleocr_df['text'].apply(lambda x: x[1]) # 可选:删除原text列 paddleocr_df = paddleocr_df.drop('text', axis=1)
处理后即可得到期望的分栏格式,后续文本清洗仅针对TEXT列,不会与置信度混淆。
内容的提问来源于stack exchange,提问作者lan
相关产品推荐
相关产品推荐

