确定一个范围是否在另一个范围内

时间:2016-05-26 00:25:08

标签: python pandas

如果文件的范围按第一列排序(范围不重叠):

1 10
12 15
18 19

另一个,按第一列排序(可以有重叠):

1 5
2 10
12 13
13 20

如果此行(范围)与第一个文件中的任何范围相交,我想确定第二个文件中的每一行(范围)。到目前为止我做了以下

df_1 = pd.read_csv('range1.txt',sep=' ')
df_2 = pd.read_csv('range2.txt',sep=' ')

for i in xrange(len(df_1)):
    start_1 = df_1.iloc[i,0]
    stop_1 = df_1.iloc[i, 1]
    for j in xrange(len(df_2)):
        start_2 = df_2.iloc[j,0]
        stop_2 = df_2.iloc[j, 1]
        if start_2 > stop_1:
            break
        elif stop_2 < start_1:
            continue
        else:
            # add ranges from second file to list

我知道这可能非常低效,所以我想知道是否有更高计算效率/更快的方法来解决这个问题。

2 个答案:

答案 0 :(得分:2)

@Olivier Pellier-Cuit提供了link to fast overlap test。如果您需要进行成员资格检查而不是重叠测试,请使用this algorithm

因此,使用此算法,我们可以执行以下操作:

changePass.pl

PS我通过删除df1['m'] = (df1.a + df1.b) df1['d'] = (df1.b - df1.a) df2['m'] = (df2.a + df2.b) df2['d'] = (df2.b - df2.a) df2[['m','d']].apply(lambda x: (np.abs(df1.m - x.m) < df1.d +x.d).any(), axis=1) 略微简化了md的计算,因为它可以消除常用术语。

输出:

division by 2

设置:

In [105]: df2[['m','d']].apply(lambda x: (np.abs(df1.m - x.m) < df1.d +x.d).any(), axis=1)
Out[105]:
0     True
1     True
2     True
3     True
4    False
dtype: bool

注意:我故意在DF2上添加了一对(50,60),它与DF1的任何间隔都不重叠

包含已计算df1 = pd.read_csv(io.StringIO(""" a b 1 10 12 15 18 19 """), delim_whitespace=True) df2 = pd.read_csv(io.StringIO(""" a b 1 5 2 10 12 13 13 20 50 60 """), delim_whitespace=True) m列的数据框:

d

答案 1 :(得分:0)

如果您只是想知道df2的范围是否与df1的范围重叠:

if df1.ix[:,0].min() >= df2.ix[:,0].max() or df1.ix[:,0].max() <= df2.ix[:,0].min(): print ("nope") else: print ("overlap")