You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:35:25