【问题标题】:Efficient way of merging ranges (intervals) within a given threshold在给定阈值内合并范围(间隔)的有效方法
【发布时间】:2018-02-16 10:46:53
【问题描述】:

我想知道是否有一种有效的方法来计算范围距离并将它们组合成给定的距离。例如,给定 d=10 的范围和距离:

1   2
4   7
12  15
32  36
38  41
...

第一次迭代将是:(4-2) -> 2 -> 2 OK -> (1,7)

1   7
12  15
32  36
38  41
...

(12-7) -> 5 -> 5 OK -> (1,15)

1   15
32  36
38  41
...

(32-15) -> 17 -> 17 KO

1   15
32  36
38  41
...

(38-36) -> 2 -> 2 OK -> (32,41)

期望的(结果)数据集:

1   15
32  41
...

如果没有有效实施,该算法(列表、元组、循环)的成本可能会给主程序带来风险。

提前谢谢你!!

【问题讨论】:

  • 原始数据是如何存储的?是二维列表吗?
  • 不,它是一个包含三列(name、range_ini、range_end)的数据框,但我可以将其调整为算法输入
  • 你有没有尝试过并遇到效率问题?

标签: python algorithm pandas merge biopython


【解决方案1】:

来源 DF:

In [27]: df
Out[27]:
   start  end
0      1    2
1      4    7
2     12   15
3     32   36
4     38   41

In [28]: threshold = 10

矢量化解:

In [31]: (df.groupby(df['start'].sub(df['end'].shift()).ge(threshold).cumsum())
    ...:    .agg({'start':'first','end':'last'}))
    ...:
Out[31]:
   start  end
0      1   15
1     32   41

解释:

In [32]: df['start'].sub(df['end'].shift())
Out[32]:
0     NaN
1     2.0
2     5.0
3    17.0
4     2.0
dtype: float64

In [33]: df['start'].sub(df['end'].shift()).ge(threshold)
Out[33]:
0    False
1    False
2    False
3     True
4    False
dtype: bool

In [34]: df['start'].sub(df['end'].shift()).ge(threshold).cumsum()
Out[34]:
0    0
1    0
2    0
3    1
4    1
dtype: int32

【讨论】:

  • 您好!谢谢!它似乎有效!我会用一个大文件检查它。它仍然适用于三列吗??
  • @Solar,三列?你能提供一个小的可重复数据集吗?
  • 你好,别担心!反正我能应付。我去看看!
  • @Solar,我认为您需要将其中一个聚合函数(first、last、min、max 等)应用于name
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多