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

Pandas按文本标签筛选两行间数据并完成表结构化转换问题

你遇到的报错核心是df.index[匹配条件]返回的是索引数组而非单个整数,直接传入iloc切片就会触发类型错误,多匹配或者无匹配的情况还会进一步触发值错误和索引越界。

1. 安全获取两个标签之间的数据集

先对匹配结果做非空校验,取第一个匹配到的索引值转为整数再切片,同时去除文本前后空格避免PDF转换时的空白字符干扰:

import pandas as pd

# 匹配起始标记
emerg_start_list = df.index[df['ElementText'].str.strip() == 'Emergency Contacts'].tolist()
if not emerg_start_list:
    raise ValueError("未找到Emergency Contacts起始标记")
emerg_start_idx = emerg_start_list[0]

# 匹配结束标记
emerg_end_list = df.index[df['ElementText'].str.strip() == 'End Employee Line'].tolist()
if not emerg_end_list:
    raise ValueError("未找到End Employee Line结束标记")
emerg_end_idx = emerg_end_list[0]

# 切片取中间数据,iloc左闭右开刚好排除结束标记行
emer_between = df.iloc[emerg_start_idx + 1 : emerg_end_idx]

2. 构建X1与字段名的映射

取Emergency Contacts后第一行(即最小ElementRow对应的行)作为表头,生成X1坐标到字段名的对应关系:

# 提取表头行
header_row = emer_between[emer_between['ElementRow'] == emer_between['ElementRow'].min()]
# 构建X1到字段的映射字典
x1_field_map = dict(zip(header_row['X1'], header_row['ElementText'].str.strip()))

3. 按行组装结构化数据

按ElementRow分组逐行匹配字段,过滤空行后生成结果表:

contact_records = []
# 跳过表头行,遍历所有数据行
data_groups = emer_between[emer_between['ElementRow'] > header_row['ElementRow'].iloc[0]].groupby('ElementRow')
for _, row_group in data_groups:
    record = {}
    for _, cell in row_group.iterrows():
        # 按X1坐标匹配对应字段
        field = x1_field_map.get(cell['X1'])
        if field:
            record[field] = cell['ElementText'].strip()
    if record:
        contact_records.append(record)

# 转成结构化DataFrame
emergency_contact_df = pd.DataFrame(contact_records)
# 统计有效记录总数
total_count = len(emergency_contact_df)
print(f"有效紧急联系人记录数:{total_count}")

适配说明

  • 所有文本匹配逻辑都加了str.strip(),避免PDF转换时产生的多余换行、空格导致匹配失败
  • 提前对起止标记的匹配结果做非空校验,从根源避免索引越界问题
  • 按ElementRow分组的逻辑适配了PDF转换时同一行文本拆分多条记录的情况,不会出现字段错位

内容的提问来源于stack exchange,提问作者lug0lug0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:51:02