我的数据框如下所示:
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
答案 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行,因为示例中的所有间隔都重叠了。