作为一个更大的数据集的一部分,我有一个DataFrame
组织如下:
Chromosome arm Start End ratio_median
5 5.5 96100001 96150000 -0.582
5 5.5 96150001 96200000 -0.582
5 5.5 96200001 96250000 -0.582
5 5.5 96250001 96300000 -0.582
5 5.5 96300001 96350000 -0.582
字符串
这里的目标是将具有相同Chromosome
、arm
和ratio_median
的行分组,并使用最小值Start
和最大值End
形成更大的间隔。
这看起来像是一个可以用groupby
解决的标准问题:
grouped = df.groupby(by=["Chromosome", "arm", "ratio_median"]).agg(
{"Chromosome": "first", "Start": "min", "End": "max", "ratio_median": "first"})
型
然而,由于这些是坐标,分组应该只考虑具有共同分组键的连续组,而不是整个数据集。换句话说,当同一染色体和臂的ratio_median
发生变化时,应该设置组边界。groupby
方法可以完美地工作,直到你有相同值的区间,这些区间被一个或多个不同键的区间分隔开(ratio_median
是判别元素)。例如,从这些数据开始:
Chromosome arm Start End ratio_median
5 5.5 96150001 96200000 -0.582
5 5.5 96200001 96250000 -0.582
5 5.5 96250001 96300000 -0.582
5 5.5 96300001 96350000 -0.582
5 5.5 97000001 97050001 -0.582
5 5.5 102600001 102650000 -0.014
5 5.5 102650001 102700000 -0.014
5 5.5 102700001 102750000 -0.014
5 5.5 102750001 102800000 -0.014
5 5.5 102800001 102850000 -0.014
5 5.5 103700001 103750000 -0.582
5 5.5 103750001 103800000 -0.582
5 5.5 103800001 103850000 -0.582
5 5.5 103850001 103900000 -0.582
5 5.5 103900001 103950000 -0.582
型
这里有三个独立的间隔:但是使用groupby
分组会将第三个间隔与第一个间隔合并(正确:它按预期工作):
Chromosome arm Start End ratio_median
5 5.5 96100001 103950000 -0.582
5 5.5 102600001 102850000 -0.014
型
从坐标的Angular 来看,这是不正确的,因为它们不应该像这样重叠:只有具有相同分组键的连续行才应该被聚合。正确的预期结果应该是:
Chromosome arm Start End ratio_median
5 5.5 96100001 97050001 -0.582
5 5.5 102600001 102850000 -0.014
5 5.5 103700001 103950000 -0.582
型
然而,我不知道如何在pandas中正确地做到这一点,也不知道如何使用额外的特定于域的库,如PyRanges
或bioframe
。我已经尝试过PyRanges.cluster()
,但另一方面,它以不同的方式分配ID,结果间隔较小。
我猜这里需要某种形式的迭代,但是最好的方法是什么呢?我已经单独尝试过groupby
,但是同样受到上面问题的困扰。
2条答案
按热度按时间7xzttuei1#
您可以将每个分组的End与移动的Start进行比较,以形成一个新的分组器:
字符串
输出量:
型
中间体:
型
如果只想按选定列中的连续行进行分组:
型
输出量:
型
zmeyuzjn2#
@mozway提出的解决方案很接近,但在某些情况下不起作用,主要是因为我没有提到在具有相同比率的间隔中可以存在“间隙”(因此存在
End
和后续Start
之间的差异> 1的情况)。然而,建议的分组策略让我走上了正确的道路。我们需要用相同的比率对间隔进行分组,这样我们就可以在它发生变化时替换检查(
observed
被设置为True
,因为在处理过程中进行的一些操作返回分类):字符串
在我自己的数据集中,现在我发现数据是正确聚合的。