熊猫滚动数据框以创建集群

时间:2018-08-28 14:26:41

标签: python pandas numpy dataframe scikit-learn

我正在尝试通过以固定增量(y)对特定窗口大小(x)进行累加总和来在python中创建数据帧,如果总和大于预定义值(z),我想添加值(取决于列)到另一个数据框。我可以使用大量的for循环来执行此操作,但这似乎效率很低。

要详细描述问题,这是我的数据框的外观:

│ Start  │ End    │ Count │
├────────┼────────┼───────┤
│ 49076  │ 49095  │ 1     │
│ 50296  │ 50318  │ 1     │
│ 53291  │ 53308  │ 1     │
│ 56213  │ 56232  │ 3     │
│ 86489  │ 86508  │ 13    │
│ 86489  │ 86508  │ 7     │
│ 150696 │ 150713 │ 1     │
│ 174807 │ 174824 │ 1     │
│ 192491 │ 192508 │ 1     │
│ 203977 │ 203996 │ 1     │
│ 269679 │ 269696 │ 1     │
⋮

,窗口将在“开始”而不是行上运行。这意味着如果该窗口为10000(x),则第一个窗口将从49076开始,以59076结束。以1000(y)为增量,第二个窗口将从50076开始,以60076结束,依此类推。现在,如果在这些窗口中的任何一个中,Count列的总和超过阈值(z),则我希望该窗口的min(Start)和max(End)以及总和作为行存储在新数据帧中(窗口重叠)合并)。 注意:理论上,该窗口也可以从0/1开始,并以max(End)结束。

最有效的方法是什么(使用pandas,numpy或scikit-learn)?

编辑:我制作了一个图表来大致描述我想要的内容。在我的情况下,pandas数据框实际上是在描述长线的段*。我想要的是另一个数据帧,如果窗口中的各个段的总和超过阈值,我会将最左边的段的开始和最右边的段的结尾放入新的数据帧中。 *-(如果我们认为count列仅包含一个)

enter image description here

注意:我对Julia提出了类似的问题,该问题现已删除。可以将其视为类似于聚类,唯一的区别是,聚类是在一条线上而不是在二维或二维线上创建的,并且点之间的距离只是坐标的减法。

1 个答案:

答案 0 :(得分:0)

好的-我正在尝试发布一个临时解决方案:并不真正建议任何人尝试。

for i in positiveFrame.chr.unique():
    workingFrame = positiveFrame[positiveFrame['chr'] == i]
    totalPeaks = workingFrame['count'].sum()
    # print ("Total amount of peaks in contig: ", i, ": ", totalPeaks)
    if totalPeaks < minimumSum:
        continue
    hits = workingFrame.start.tolist()
    runningFrame = pd.DataFrame({'start': range(1, lengthFile[str(i)]), 'hit': 0})
    runningFrame.loc[runningFrame.start.isin(hits), ['hit']] = 1
    for k in range(0, runningFrame.shape[0], incrementSize):
        z = runningFrame[k:k + incrementSize]
        if (z['hit'].sum() > 49):
            #print("banzai\n")
            positiveClusterChr.append(i)
            positiveClusterStart.append(z['hit'].eq(1).idxmax())
            positiveClusterEnd.append(z.hit[::-1].idxmax())

这里实际上发生的事情是,我正在创建另一个数据帧,其坐标从0开始到max(End)结束-此步骤效率极低且占用内存。在这种情况下,长度由每个唯一的chr的数组定义。在下一步中,我将基于起始位置,将匹配数(计数)分配给与我的输入数据框匹配的位置。在最后一步中,我将遍历扩展的数据框,方法是每次切片1000行,然后对匹配进行求和。对于匹配的窗口或数据框切片,我将最小和最大坐标存储在数组中。 笨拙,效率低下和冗余的代码,但以某种方式在最低级别上起作用。