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
相关产品推荐
相关产品推荐

