基于DataFrame B的位置快速提取DataFrame A中的子序列
高效提取DataFrame指定位置子序列的方案
问题背景
需要根据DataFrame B 中的first和last位置,从DataFrame A 的对应序列中提取子序列。原循环实现效率偏低,现提供基于Pandas向量操作的高效替代方案。
数据定义
import pandas as pd A = pd.DataFrame({'first.sequence': ['AAACACCCGGAG','ACCACACCCCAAATGTGT'], 'first':[1,100], 'last':[12,117]}) B = pd.DataFrame({'first': [3,8,105,115], 'last':[5,12,111,117]})
高效实现代码
# 对A、B按first字段排序,满足merge_asof的排序要求 A_sorted = A.sort_values('first').reset_index(drop=True) B_sorted = B.sort_values('first').reset_index(drop=True) # 匹配B的每一行到A中对应的区间(A.first <= B.first <= A.last) merged = pd.merge_asof( B_sorted, A_sorted, on='first', direction='backward', allow_exact_matches=True ) # 过滤掉超出A区间范围的行(确保B.last <= A.last) merged = merged[merged['last_x'] <= merged['last_y']].reset_index(drop=True) # 计算0-based的切片起始/结束索引 merged['start'] = merged['first_x'] - merged['first_y'] merged['end'] = merged['last_x'] - merged['first_y'] + 1 # 批量提取子序列 merged['sequences'] = merged['first.sequence'].str.slice(start=merged['start'], stop=merged['end']) # 整理为目标输出格式 result = merged[['first_x', 'last_x', 'sequences']].rename(columns={'first_x':'first', 'last_x':'last'}) print(result.to_string(index=False))
输出结果
first last sequences 3 5 ACA 8 12 CGGAG 105 111 ACCCCAA 115 117 TGT
方案优势
- 全程使用Pandas向量化操作,避免逐行循环,处理大数据量时效率提升显著
- 利用
merge_asof高效完成区间匹配,逻辑清晰且性能优于手动遍历判断 - 字符串切片采用
str.slice批量处理,进一步提升执行速度
内容的提问来源于stack exchange,提问作者Md Abrar Jahin
相关产品推荐
相关产品推荐

