Удалите перекрывающиеся целочисленные кортежи / диапазоны как по максимальной величине перекрытия, так и по проценту перекрытия - PullRequest
0 голосов
/ 01 октября 2019

Это часть 2 к предыдущему вопросу, который я задал с новым кодом, который мы получили. У меня есть список диапазонов, таких как:

[(0, 90), (27, 99), (28, 229), (126, 291), (138, 379)]

И мне нужно отфильтровать или удалить диапазоны, которые перекрывают больше, чем x (например, перекрывают больше 10) и / или перекрывают больше, чем x%(Скажем, 20%) наименьшего из сравниваемых диапазонов. Приведенный ниже код полностью удаляет эти кортежи внутри другого.

     hold = []
     for idx1 in range(len(ranges)):
         start_1, stop_1 = ranges[idx1]
         for idx2, (start_2, stop_2) in enumerate(ranges):
             if idx1 == idx2 and stop_1 == stop_2:
                 continue
             if start_2 <= start_1 and stop_1 <= stop_2:
                 hold.append(idx1)
             if start_2 > stop_1:
                 break

Затем мне сказали использовать кадр данных pandas, как показано ниже, для удаления перекрывающихся диапазонов.

     df = pd.DataFrame(encap_ranges, columns=["start", "stop"]).sort_values("start")

     df["length"] = df["stop"] - df["start"]
     df["bool_1"], df["bool_2"] = True, True

     while any(df["bool_1"].eq(True) & df["bool_2"].eq(True)):
         df["overlap"] = df["stop"] - df["start"].shift(-1)
         df["pc"] = df["overlap"] / df["length"]

         df["bool_1"] = df["overlap"] > OverLapValue
         df["bool_2"] = df["pc"] > OverLapPercentage
         for i, row in df.sort_index(ascending=False).iterrows():
             if row["bool_1"] == row["bool_2"] and row["bool_1"] is not False:
                 df.drop(i, inplace=True)
                 break

Однако то, что это делает, неправильно удаляет кортеж (0,90) вместо того, чтобы (27,99) оставить меня с диапазонами:

['12-48', '40-80', '75-400']

Я полагаю, это потому, что мы смотрим только на сравнение двух кортежей за раз, и на самом деле мне нужно сравнить несколько диапазонов вв то же время, чтобы определить правильный удалить.

...