Python 熊猫:两个范围相交时的T/F

Python 熊猫:两个范围相交时的T/F,python,pandas,python-2.7,Python,Pandas,Python 2.7,我有两个看起来像这样的数据帧: df1: df2: 我已经看到了很多关于两个范围相交的答案。我最喜欢的是: range(max(start_1, start_2), min(end_1, end_2)) 那很好。但是,在我的上下文中,我只需要知道这两个范围是否相交。我似乎找不到适合我的用例的答案。预期的输出基本上会从df2中获取范围与df1相交的名称。预期产出将是: name start end intersects stuart 0 20 FOXP3

我有两个看起来像这样的数据帧:

df1:

df2:

我已经看到了很多关于两个范围相交的答案。我最喜欢的是:

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
或者,如果这更容易(这个解决方案实际上是理想的,但我可以使用第一个):


实际上,我一直坚持的是,在没有for循环的情况下,得到两行之间的范围是否相交的真/假。对于我来说,for循环不是一个可行的解决方案,因为我有4万行,而不是6万行。

根据您已有的信息,您需要回答的问题是,在
范围内是否有任何内容

if max(start_1, start_2) <= min(end_1, end_2):

if max(start_1,start_2)仅使用数学方法+
numpy
广播

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
v1=df1.start.values
v2=df1.end.values
s1=df2.start.values
s2=df2.end.values

s=pd.数据帧((s2-v1[:,无])>0)和((s1-v2[:,无])
start
end
总是整数吗?你认为截取是稀疏的吗?如果是这样,可能会有一个算法加速,相对于原始方法。start和end总是整数,但我不确定截取的稀疏性。我不完全确定我是否理解你的回答,但我会检查interval模块。感谢您的建议。这非常有效,但我确实有一个问题:我的df2有1254113行长。对于我的测试用例df1有200行,这仍然有效。我的实际df1有40000行(将来可能会更大)用DF1的60000来运行这个代码是命中代码>内存错误>代码>你有什么想法吗?@ JohnRouhana,你可以考虑把DF1分割成块,如果我要用这个方法,这似乎是我唯一的选择。谢谢。
name    start    end    intersects
stuart  0        20     FOXP3
lamp    32       34     LOXL1
hamlet  16       100    LOXL1
hamlet  16       100    INSN
if max(start_1, start_2) <= min(end_1, end_2):
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