我有一个表格(程序的简化输出),我需要过滤:
id hit from to value
A hit1 56 102 0.00085
B hit2 89 275 0.00034
B hit3 240 349 0.00034
C hit4 332 480 3.40E-15
D hit5 291 512 3.80E-24
D hit6 287 313 0.00098
D hit7 381 426 0.00098
D hit8 287 316 0.0029
D hit9 373 422 0.0029
D hit10 514 600 0.0021
对于每个id,df
应该按from
排序,如果有重叠的命中,则保留value
下面的那个。在
到目前为止,这是我的代码,它首先以from
开头,然后以value
开头:
但是,我如何检查重叠(from
到to
)&删除得分较高的那一个?在
这是我的预期输出:
id hit from to valu
A hit1 56 102 0.00085
C hit4 332 480 3.40E-15
D hit5 291 512 3.80E-24
D hit10 514 600 0.0021
请注意,id B
有两个相同值的重叠命中,因此这两个条目都将被踢出。在
首先,我们引入一个唯一的} :
ID
,并使用^{在此之后,我们将df与自身结合并计算重叠部分:
^{pr2}$现在我们知道哪些id重叠,但不知道哪个id构建了一个连接的组件。一般来说,这不能通过像重新排序这样的简单算法来完成,但是位graph theory有帮助。所以我们建立了一个图
graph = connected.groupby(['id', 'ID_x']).agg(list)
通过depth first search计算连通分量
conns
包含连接的组件,我们可以将它们组合在一起:data = df.merge(conns[['Subgraph', 'ID']], on=['ID'])
最后一个任务是选择要保留的行:
现在我们完成了:
如果你不介意在你的代码中有多行代码,我想这样的方法应该行得通。。。(这里是python新手…source
“keep”参数设置为false,因为您根本不需要重复的行。在
结果是:
^{pr2}$并且要删除混乱的索引列:
结果是:
附言:这是我第一次回答,所以,请温柔一点。而且,我还在学英语。在
所以我的解决方案是用一个掩模来检查重叠。通过对“from”值进行排序,并检查下一个“from”值是否小于上一个“to”值。这个np.inf公司只需确保分组中的第一个值始终为0。在
然后我们在df中把这个面具列为自己的列。然后我们根据需要进行分组,删除所有重复项,重置索引,最后删除掩码。在
相关问题 更多 >
编程相关推荐