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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:24:42