如何将pp-structure的边界框与置信度映射到Pandas DataFrame(忽略指定列)
实现方案
以下是针对需求的具体实现步骤和代码,直接对应PaddleOCR pp-structure的输出结构,忽略NaN值并跳过Description列的映射:
1. 核心思路
- 先定位
DataFrame中的Description列,过滤掉boxes和rec_res中对应该列的元素 - 遍历表格的非NaN单元格,将对应的边界框和置信度值映射到新增列中
2. 完整代码实现
import pandas as pd # 示例PaddleOCR识别结果(替换为你的实际结果) result = { 'res': { 'html': '<table><tr><th>ID</th><th>Name</th><th>Description</th></tr><tr><td>1</td><td>Alice</td><td>Engineer</td></tr><tr><td>2</td><td></td><td>Designer</td></tr><tr><td>3</td><td>Charlie</td><td></td></tr></table>', 'boxes': [ [[10,10,40,25], [50,10,90,25], [100,10,200,25]], [[10,35,40,50], [50,35,90,50], [100,35,200,50]], [[10,60,40,75], [50,60,90,75], [100,60,200,75]], [[10,85,40,100], [50,85,90,100], [100,85,200,100]] ], 'rec_res': [ [('ID',0.99), ('Name',0.98), ('Description',0.97)], [('1',0.99), ('Alice',0.98), ('Engineer',0.95)], [('2',0.99), ('',0.0), ('Designer',0.96)], [('3',0.99), ('Charlie',0.97), ('',0.0)] ] } } # 1. 从HTML构建初始DataFrame df = pd.read_html(result['res']['html'])[0] # 2. 定位Description列并过滤边界框、置信度数据 desc_col_name = 'Description' desc_col_idx = df.columns.get_loc(desc_col_name) # 过滤boxes:移除每行中对应Description列的边界框 filtered_boxes = [row[:desc_col_idx] + row[desc_col_idx+1:] for row in result['res']['boxes']] # 过滤置信度:移除每行中对应Description列的置信度,仅保留数值 filtered_confidences = [] for row_rec in result['res']['rec_res']: conf_row = [rec[1] for idx, rec in enumerate(row_rec) if idx != desc_col_idx] filtered_confidences.append(conf_row) # 3. 添加bbox和confidence列到DataFrame df['bbox'] = None df['confidence'] = None # 4. 遍历数据行,映射非NaN单元格的边界框和置信度 for df_row_idx in range(len(df)): # rec_res第一行是表头,对应df的列名,数据行从rec_res[1:]开始 rec_row_idx = df_row_idx + 1 current_boxes = filtered_boxes[rec_row_idx] current_confs = filtered_confidences[rec_row_idx] for df_col_idx in range(len(df.columns)): col_name = df.columns[df_col_idx] if col_name == desc_col_name: continue # 计算过滤后的列索引(跳过Description列后索引偏移) filtered_col_idx = df_col_idx if df_col_idx < desc_col_idx else df_col_idx - 1 # 仅处理非NaN且非空的单元格 cell_val = df.iloc[df_row_idx, df_col_idx] if pd.notna(cell_val) and str(cell_val).strip() != '': df.at[df_row_idx, 'bbox'] = current_boxes[filtered_col_idx] df.at[df_row_idx, 'confidence'] = current_confs[filtered_col_idx] # 查看最终结果 print(df)
3. 代码说明
- 过滤逻辑:通过列索引定位
Description列,移除boxes和rec_res中对应位置的元素 - 非NaN判断:使用
pd.notna()结合空字符串检查,确保仅处理有效单元格 - 索引映射:处理
Description列前后的列索引偏移问题,保证边界框和置信度对应正确
运行后输出示例:
ID Name Description bbox confidence 0 1 Alice Engineer [10, 35, 40, 50] 0.99 1 2 NaN Designer [10, 60, 40, 75] 0.99 2 3 Charlie NaN [50, 85, 90, 100] 0.97
内容的提问来源于stack exchange,提问作者Arham Shah
相关产品推荐
相关产品推荐

