如何用Pyranges获取重叠行索引,无重叠时返回NULL?
使用PyRanges获取重叠区域的索引向量
完全可以用PyRanges实现这个需求,核心思路是通过左连接保留pr1的所有行,再通过分组整理得到每个pr1行对应的pr2重叠行索引,无重叠的位置返回None(对应R中的NULL)。以下是具体实现步骤:
步骤1:为PyRanges添加原始索引
先给pr1和pr2添加原始行号列,避免操作后丢失原数据的行索引:
import pyranges as pr import pandas as pd # 给pr1添加原始索引列 pr1["pr1_idx"] = range(len(pr1)) # 给pr2添加原始索引列 pr2["pr2_idx"] = range(len(pr2))
步骤2:执行重叠左连接
使用join方法执行左连接,确保pr1的每一行都被保留,即使没有与pr2重叠的区域:
# 左连接,仅保留重叠区域的匹配(how='left'确保pr1全量保留) joined_pr = pr1.join(pr2, how="left")
步骤3:分组整理索引
将连接后的结果转为DataFrame,按pr1的原始索引分组,收集对应的pr2索引,并处理无重叠的情况:
# 转为DataFrame方便分组操作 joined_df = joined_pr.df # 按pr1的原始索引分组,收集对应pr2的索引 grouped_indices = joined_df.groupby("pr1_idx")["pr2_idx"].apply(list) # 生成最终结果向量:无重叠则返回None result = [] for idx in range(len(pr1)): if idx in grouped_indices: # 过滤掉无重叠时产生的NaN值 valid_indices = [i for i in grouped_indices[idx] if pd.notna(i)] result.append(valid_indices if valid_indices else None) else: result.append(None)
说明
- 左连接(
how='left')是关键:它保证pr1的50行都会出现在结果中,没有重叠的行对应的pr2索引会是NaN。 - 最终的
result是长度为50的列表,每个元素要么是pr2中重叠行的索引列表,要么是None,完全匹配你需要的R中类似的行为。
内容的提问来源于stack exchange,提问作者Moses Stamboulian
相关产品推荐
相关产品推荐

