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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:50:25