【问题标题】:Remove overlapping ranges from python pandas data frame从 python pandas 数据框中删除重叠范围
【发布时间】:2015-10-24 01:30:45
【问题描述】:

我的数据框如下所示:

NNC_009925.1     NC_009925.1     100.00  5356    0       0       5635975 5641330 1410850 1405495 0.0      9891
NC_009925.1     NC_009925.1     100.00  5356    0       0       1405495 1410890 5641330 5635975 0.0      9850
NC_009925.1     NC_009925.1     99.57   2788    12      0       3711607 3714394 1346122 1343335 0.0      5083
NC_009925.1     NC_009925.1     99.57   2788    12      0       1343335 1346122 3714394 3711659 0.0      5037

第 7 列和第 8 列代表一个范围 (Range1),而第 9 列和第 10 列代表第二个范围 (Range2)。我想删除数据框中 Range1 与 Range2 的任何行重叠的所有实例。保留的标准将基于最右侧列中的最高值。所以输出看起来像这样:

NC_009925.1     NC_009925.1     100.00  5356    0       0       5635975 5641330 1410850 1405495 0.0      9891
NC_009925.1     NC_009925.1     99.57   2788    12      0       3711607 3714394 1346122 1343335 0.0      5083

【问题讨论】:

  • 很难看出什么是 col 7,8,9,10。大概是空格分隔,但在某些情况下,你有比其他更多的空间。一个空格也是分栏吗?这些范围之后似乎有两列。
  • 重叠是指完全重叠,还是部分重叠已经足以删除一行?
  • 第 7 列和第 8 列中的值是否在增加? (范围可能会减小,但您的情况是否如此?)第 9 列和第 10 列同上。
  • 到目前为止你自己尝试过什么?
  • this 问题在本质上相似(即处理重叠范围)

标签: pandas


【解决方案1】:

如果您提供列名会有所帮助。

您的第二个范围是否定义为 10 -> 9,因为第 9 列中的值大于第 10 列中的值?

你的例子正确吗?据我了解,第一行输出的间隔与第二行输入的间隔重叠,第二条输出线与输入的第四行重叠。

如果我的解释正确,您可以使用区间树。你可以在https://github.com/chaimleib/intervaltree 安装一个intervaltree 包。然后你可以使用:

import pandas as pd
import StringIO

from intervaltree import Interval, IntervalTree


df = pd.read_table(StringIO.StringIO('''a b c d e f g h i k l m
NNC_009925.1     NC_009925.1     100.00  5356    0       0       5635975 5641330 1410850 1405495 0.0      9891
NC_009925.1     NC_009925.1     100.00  5356    0       0       1405495 1410890 5641330 5635975 0.0      9850
NC_009925.1     NC_009925.1     99.57   2788    12      0       3711607 3714394 1346122 1343335 0.0      5083
NC_009925.1     NC_009925.1     99.57   2788    12      0       1343335 1346122 3714394 3711659 0.0      5037
NC_009925.1     NC_009925.1     99.57   2788    12      0       943335 946122 3714394 3711659 0.0      5037'''), delim_whitespace=True)

range2 = IntervalTree.from_tuples(zip(df['k'], df['i']+1))

df['start_overlaps'] = df['g'].apply(lambda x: range2.overlaps(x))
df['end_overlaps'] = df['h'].apply(lambda x: range2.overlaps(x))

df['overlaps'] = df.start_overlaps | df.end_overlaps

df = df[~df.overlaps]
df

我添加了第 5 行,因为您示例中的所有间隔都重叠。

【讨论】:

  • 当我执行 IntervalTree.from_tuples 行时,我收到一条错误消息:ValueError: IntervalTree: Null Interval objects not allowed in IntervalTree: Interval(3975158, 3974200)。我假设这是因为第 9 列和第 10 列互换包含更大的值。
  • @user3654634 是的,它需要它们(低,高)。您可以按正确的顺序创建两个新列。
猜你喜欢
  • 1970-01-01
  • 2021-05-19
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2021-05-09
相关资源
最近更新 更多