熊猫:如果两个范围相交,则为T / F

时间:2018-11-30 21:05:49

标签: python pandas python-2.7

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

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万行。

2 个答案:

答案 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模块中找到更好的工具;这会在已知的时间间隔内执行各种操作;我希望可以使用矢量化工具。