我有两个看起来像这样的数据框:
df1:
name start end
stuart 0 20
lamp 32 34
hamlet 16 100
df2:
name start end
LOXL1 30 40
FOXP3 0 11
INSN 43 70
我看到了很多找到两个范围之间交集的答案。我最喜欢的是:
range(max(start_1, start_2), min(end_1, end_2))
很好。但是,就我的情况而言,我只需要知道两个范围是否相交即可。我似乎找不到适合我的用例的答案。预期的输出将基本上从df2中获取与df1相交的名称。预期输出为:
name start end intersects
stuart 0 20 FOXP3
lamp 32 34 LOXL1
hamlet 16 100 LOXL1|INSN
或者,如果这更容易(此解决方案实际上是理想的,但我可以使用第一个解决方案):
name start end intersects
stuart 0 20 FOXP3
lamp 32 34 LOXL1
hamlet 16 100 LOXL1
hamlet 16 100 INSN
我真正坚持的是在两行之间的范围是否相交的情况下获得True / False,而没有for循环。对于我来说,for循环不是一个可行的解决方案,因为相比之下,我有4万行,而有600万行。
答案 0 :(得分:4)
只需使用数学方式+ numpy
broadcast
v1=df1.start.values
v2=df1.end.values
s1=df2.start.values
s2=df2.end.values
s=pd.DataFrame(((s2-v1[:,None])>0)&((s1-v2[:,None])<0)).dot(df2.name+'|').str[:-1]
s
Out[737]:
0 FOXP3
1 LOXL1
2 LOXL1|INSN
dtype: object
#df1['New']=s.values
答案 1 :(得分:0)
您需要回答的问题是,您知道的range
中是否有任何东西。
if max(start_1, start_2) <= min(end_1, end_2):
您可能会在interval
模块中找到更好的工具;这会在已知的时间间隔内执行各种操作;我希望可以使用矢量化工具。