【问题标题】:Interval intersection in pandas大熊猫的区间交叉点
【发布时间】:2017-02-01 15:44:26
【问题描述】:

更新 5:

此功能已作为 pandas 20.1 的一部分发布(在我生日那天:])

更新 4:

PR 已合并!

更新 3:

The PR has moved here

更新 2:

这个问题似乎对re-opening the PR for IntervalIndex in pandas 有所贡献。

更新:

我不再有这个问题,因为我现在实际上正在查询来自 AB 的重叠范围,而不是来自 B 的点,它们属于 A 的范围内,这是一个完整的区间树问题。不过我不会删除这个问题,因为我认为它仍然是一个有效的问题,而且我没有一个好的答案。

问题陈述

我有两个数据框。

在数据帧A 中,两个整数列合在一起表示一个区间。

在数据框B中,一个整数列代表一个位置。

我想做一种连接,以便将点分配给它们所在的每个间隔。

间隔很少但偶尔会重叠。如果一个点落在该重叠范围内,则应将其分配给两个区间。大约一半的点不会落在一个区间内,但几乎每个区间都会在其范围内至少有一个点。

我一直在想什么

我最初打算从 pandas 中转储我的数据,并使用 intervaltreebanyan 或者 bx-python 但后来我遇到了这个 gist。事实证明,shoyer 的想法从来没有进入过 pandas,但这让我开始思考——可能在 pandas 中做到这一点,而且因为我希望这段代码尽可能快地运行 python,所以我'宁愿直到最后才将我的数据从熊猫中转储出来。我也觉得 bins 和 pandas cut 函数可以做到这一点,但我是 pandas 的新手,所以我可以使用一些指导!谢谢!

注意事项

可能相关? Pandas DataFrame groupby overlapping intervals of variable length

【问题讨论】:

  • 您需要发布您的示例数据框和所需的示例输出
  • 如何发布数据框?它又宽又高,我觉得我已经提供了重要的信息。如果您愿意,具体的名称是 A.txStartA.txEnd 用于区间,B.tss 用于点。它们都是相当大的整数。
  • 发布绝对最小的数据,这将产生一个可以解决您的问题的答案。这意味着您需要使用最少的列创建准确模拟您遇到的情况的假数据。

标签: python pandas interval-tree


【解决方案1】:

此功能是作为 pandas 20.1 的一部分发布的

【讨论】:

  • 能发个链接吗?
【解决方案2】:

pyranges回答,基本上就是给熊猫撒了生物信息学糖。

设置:

import numpy as np
np.random.seed(0)
import pyranges as pr

a = pr.random(int(1e6))
# +--------------+-----------+-----------+--------------+
# | Chromosome   | Start     | End       | Strand       |
# | (category)   | (int32)   | (int32)   | (category)   |
# |--------------+-----------+-----------+--------------|
# | chr1         | 8830650   | 8830750   | +            |
# | chr1         | 9564361   | 9564461   | +            |
# | chr1         | 44977425  | 44977525  | +            |
# | chr1         | 239741543 | 239741643 | +            |
# | ...          | ...       | ...       | ...          |
# | chrY         | 29437476  | 29437576  | -            |
# | chrY         | 49995298  | 49995398  | -            |
# | chrY         | 50840129  | 50840229  | -            |
# | chrY         | 38069647  | 38069747  | -            |
# +--------------+-----------+-----------+--------------+
# Stranded PyRanges object has 1,000,000 rows and 4 columns from 25 chromosomes.
# For printing, the PyRanges was sorted on Chromosome and Strand.

b = pr.random(int(1e6), length=1)
# +--------------+-----------+-----------+--------------+
# | Chromosome   | Start     | End       | Strand       |
# | (category)   | (int32)   | (int32)   | (category)   |
# |--------------+-----------+-----------+--------------|
# | chr1         | 52110394  | 52110395  | +            |
# | chr1         | 122640219 | 122640220 | +            |
# | chr1         | 162690565 | 162690566 | +            |
# | chr1         | 117198743 | 117198744 | +            |
# | ...          | ...       | ...       | ...          |
# | chrY         | 45169886  | 45169887  | -            |
# | chrY         | 38863683  | 38863684  | -            |
# | chrY         | 28592193  | 28592194  | -            |
# | chrY         | 29441949  | 29441950  | -            |
# +--------------+-----------+-----------+--------------+
# Stranded PyRanges object has 1,000,000 rows and 4 columns from 25 chromosomes.
# For printing, the PyRanges was sorted on Chromosome and Strand.

执行:

result = a.join(b, strandedness="same")
# +--------------+-----------+-----------+--------------+-----------+-----------+--------------+
# | Chromosome   | Start     | End       | Strand       | Start_b   | End_b     | Strand_b     |
# | (category)   | (int32)   | (int32)   | (category)   | (int32)   | (int32)   | (category)   |
# |--------------+-----------+-----------+--------------+-----------+-----------+--------------|
# | chr1         | 227348436 | 227348536 | +            | 227348516 | 227348517 | +            |
# | chr1         | 18901135  | 18901235  | +            | 18901191  | 18901192  | +            |
# | chr1         | 230131576 | 230131676 | +            | 230131636 | 230131637 | +            |
# | chr1         | 84829850  | 84829950  | +            | 84829903  | 84829904  | +            |
# | ...          | ...       | ...       | ...          | ...       | ...       | ...          |
# | chrY         | 44139791  | 44139891  | -            | 44139821  | 44139822  | -            |
# | chrY         | 51689785  | 51689885  | -            | 51689859  | 51689860  | -            |
# | chrY         | 45379140  | 45379240  | -            | 45379215  | 45379216  | -            |
# | chrY         | 37469479  | 37469579  | -            | 37469576  | 37469577  | -            |
# +--------------+-----------+-----------+--------------+-----------+-----------+--------------+
# Stranded PyRanges object has 16,153 rows and 7 columns from 24 chromosomes.
# For printing, the PyRanges was sorted on Chromosome and Strand.

df = result.df
#       Chromosome      Start        End Strand    Start_b      End_b Strand_b
# 0           chr1  227348436  227348536      +  227348516  227348517        +
# 1           chr1   18901135   18901235      +   18901191   18901192        +
# 2           chr1  230131576  230131676      +  230131636  230131637        +
# 3           chr1   84829850   84829950      +   84829903   84829904        +
# 4           chr1  189088140  189088240      +  189088163  189088164        +
# ...          ...        ...        ...    ...        ...        ...      ...
# 16148       chrY   38968068   38968168      -   38968124   38968125        -
# 16149       chrY   44139791   44139891      -   44139821   44139822        -
# 16150       chrY   51689785   51689885      -   51689859   51689860        -
# 16151       chrY   45379140   45379240      -   45379215   45379216        -
# 16152       chrY   37469479   37469579      -   37469576   37469577        -
# 
# [16153 rows x 7 columns]

【讨论】:

  • 虽然这不是 OP 问题的通用解决方案,但这对像我这样的一些人来说似乎很有用:P 你能大致了解它是如何工作的吗?
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 2015-07-30
  • 2020-06-09
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多