2016-05-26 9 views
3

内にあるかどうかを確認:最初の列(範囲の重複なし)によってソート範囲を持つファイルが存在する場合は1つの範囲は、別の

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 

私は知っている。これはひどく非効率的なことができ、これまでに以下のため、これを解決するために、より計算効率の高い/より高速な方法があれば、私は思っていたのでした。

+1

より効率的なアルゴリズムはhttps://en.wikipedia.org/wiki/Interval_tree –

+0

で見つかるはずですが、あなたには誤植があるようです: 'start_2 = df_2.iloc [j、0]; stop_2 = df_2.iloc [j、1] 'i'ではなく' j'をインデックスとして使用します。それ以外のところでは、このコードはできるだけ効率的だと思います。 –

答えて

2

@Olivier Pellier-CUITはlink to fast overlap testを提供してきました。重複テストの代わりにメンバーシップチェックが必要な場合は、this algorithmを使用してください。だから我々は、次の操作を行うことができ、このアルゴリズムを使用して

は:それは一般的な用語を排除して行うことができるので、

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) 

PS私は少し、division by 2を取り除くことによってmdの計算を簡略化してきました。

出力:

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 

セットアップ:

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) 

注:私は意図的にDF1から任意の間隔と重ならないDF2に対(50、60)を追加しました計算md列を持つ

データフレーム:

In [106]: df1 
Out[106]: 
    a b m d 
0 1 10 11 9 
1 12 15 27 3 
2 18 19 37 1 

In [107]: df2 
Out[107]: 
    a b m d 
0 1 5 6 4 
1 2 10 12 8 
2 12 13 25 1 
3 13 20 33 7 
4 50 60 110 10 
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")

+0

iitがdf_1からの任意の行(範囲)と交差する場合、df_2の各行(範囲)について知りたいと思っていました。私はこれを含むように質問を更新します – user2958395

+0

を参照してください。各ファイルにはいくつの列がありますか? –

関連する問題