Это часть 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']
Я полагаю, это потому, что мы смотрим только на сравнение двух кортежей за раз, и на самом деле мне нужно сравнить несколько диапазонов вв то же время, чтобы определить правильный удалить.