如何从PDF提取物种作者信息并迭代添加至Pandas新列
解决方法:将PDF提取的物种全名匹配到DataFrame对应列
看了你的问题,核心是循环遍历物种时没把匹配结果对应到DataFrame的正确行,导致赋值失效。这里给你两种简单直接的解决方案:
方法1:使用enumerate遍历并直接赋值
通过enumerate同时获取行索引和物种名,精准给full_name列的对应行赋值:
from PyPDF2 import PdfFileReader import pandas import regex table = pandas.read_csv('mydata.csv') table['full_name'] = '' tmp = [] pdf = 'myfile.pdf' pdf_r = PdfFileReader(pdf) page_rg = range(29, 225) for p in page_rg: page = pdf_r.getPage(p) text = page.extractText() tmp.append(text) full_text = ''.join(tmp) # 修改后的循环部分 for i, sp in enumerate(table.species): sp_re = sp + r'\s+[(A-Z][^:(\/]+(?=\s)' matches = regex.findall(sp_re, full_text) # 有匹配结果就取第一个,否则留空 table.loc[i, 'full_name'] = matches[0] if matches else ''
关键说明:
enumerate(table.species)返回每个物种的**行索引i**和物种名sp,确保赋值对应到正确行findall返回匹配结果列表,取第一个元素matches[0]避免把列表存入单元格- 用
if matches判断是否找到结果,没匹配到则留空字符串
方法2:使用pandas apply函数(推荐)
更符合pandas的高效用法,通过自定义函数+apply批量处理:
from PyPDF2 import PdfFileReader import pandas import regex table = pandas.read_csv('mydata.csv') tmp = [] pdf = 'myfile.pdf' pdf_r = PdfFileReader(pdf) page_rg = range(29, 225) for p in page_rg: page = pdf_r.getPage(p) text = page.extractText() tmp.append(text) full_text = ''.join(tmp) # 定义提取全名的函数 def get_full_species_name(species): pattern = species + r'\s+[(A-Z][^:(\/]+(?=\s)' matches = regex.findall(pattern, full_text) return matches[0] if matches else '' # 批量应用函数生成full_name列 table['full_name'] = table['species'].apply(get_full_species_name)
优势:
- 代码更简洁,避免手动循环
- 处理大数据集时效率更高,符合pandas的向量式操作逻辑
验证结果
修改后你的数据集会生成期望的输出:
id_ref id_sp species full_name 0 20053 60645 Species Subspecies 1 20053 61094 Acantholimon lycopodioides Acantholimon lycopodioides (Girard) Boiss. 2 20053 61095 Achillea millefolium Achillea millefolium L. 3 20053 61096 Aconitum chasmanthum Aconitum chasmanthum Stapf ex Holmes ...
内容的提问来源于stack exchange,提问作者Junitar
相关产品推荐
相关产品推荐

