使用正则表达式获取Pandas DataFrame列中部分匹配的行索引
用正则匹配Pandas DataFrame中DOI对应的XML ID行
你要处理大型Pandas DataFrame,目标是把论文DOI和包含该DOI的XML文件名(也就是ScID.xml列)对应起来对吧?我来给你一步步拆解实现方法,结合你的数据表示例来演示。
先看你的数据表示例
你的DataFrame大概是这样的(补全了截断的行):
import pandas as pd data = { 'ScID.xml': [ '0009-3570(2017)050[0199:omfg]2.3.co.xml', '0001-3568(2001)750[0199:smdhmf]2.3.co.xml', '0002-3568(2004)450[0199:gissaf]2.3.co.xml', '0003-3568(2011)150[0299:easayy]2.3.co.xml' ], 'journal': ['Journal_1', 'Journal_3', 'Journal_1', 'Journal_2'], 'year': [2017, 2001, 2004, 2011], 'topic1': [0.000007, 0.000648, 0.000003, 0.000123] } df = pd.DataFrame(data)
核心实现步骤
假设你的测试DOI是0009-3570(2017)050(也就是第一行XML文件名的前缀部分),我们可以用正则快速定位匹配的行。
方法1:直接匹配包含目标DOI的XML文件名
因为DOI里包含括号这类正则特殊字符,所以先转义处理,避免解析错误:
import re # 定义测试DOI test_doi = '0009-3570(2017)050' # 转义DOI中的特殊字符,生成正则匹配模式 pattern = re.escape(test_doi) # 筛选出ScID.xml列包含该DOI的行 matching_rows = df[df['ScID.xml'].str.contains(pattern)] # 查看结果 print(matching_rows)
运行后会直接返回第一行的完整数据,完美命中目标。
方法2:先提取XML中的DOI部分再匹配
如果需要批量提取所有XML文件名里的DOI片段,再和目标DOI匹配,可以用正则捕获组:
# 用正则捕获XML文件名中的DOI前缀部分(适配你的XML格式) df['extracted_doi'] = df['ScID.xml'].str.extract(r'(^[\d-]+(\(\d{4}\)\d+))')[0] # 筛选出提取的DOI和测试DOI一致的行 matching_rows = df[df['extracted_doi'] == test_doi]
这种方法适合需要先统一提取所有DOI,再做后续匹配或分析的场景。
针对大型DataFrame的优化提示
- Pandas的
str.contains()已经做了性能优化,处理百万级别的行也没问题; - 如果数据量特别大,可以预编译正则表达式,再用
apply处理:compiled_pattern = re.compile(re.escape(test_doi)) matching_rows = df[df['ScID.xml'].apply(lambda x: compiled_pattern.search(x) is not None)] - 如果你的DOI是标准格式(比如
10.xxxx/xxxx),可以把正则改成标准DOI匹配模式:r'10\.\d{4,9}/[-._;()/:A-Z0-9]+'(DOI不区分大小写,可加re.IGNORECASE参数)。
内容的提问来源于stack exchange,提问作者Lorcán
相关产品推荐
相关产品推荐

