从python pandas数据框中删除重叠范围

时间:2015-10-23 04:19:10

标签: pandas

我的数据框如下所示:

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

1 个答案:

答案 0 :(得分:0)

如果您提供了列名,这将有所帮助。

您的第二个范围定义为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行,因为示例中的所有间隔都重叠了。