Pandas中群组的多指数全对比较

时间:2015-02-13 20:07:38

标签: python numpy pandas bioinformatics

问题(正式)

我有一个平面表 df ,列 a b c d < / em>, e 其中 a b 是一对多的,( b 和< em> c )和( c d )。 d 是唯一索引, e 是任意整数。

分组= df.groupby(by = ['a','b','c'])。然后,每个组基本上由其标签和一组键值对 {d e} 组成。如果分组中没有其他组 y ,则我希望将所有行保留在某个组 x

  • x.a == y.a
  • x.b!= y.b
  • 表示 xe 中的任何值 p ,以及 ye 中的任何值 u abs( p - u)&lt; 100

如果任何组 y 符合这些条件,则 x y 中的任何行都不应出现在最终结果中。


同样的问题,已应用

我在生物信息学的背景下使用它。具体而言,(a,b,c,d,e)=(染色体,链,gene_id,transcript_id,transcription_start_site)。每个基因恰好是一条染色体上的一条链('+'或' - ',对应于DNA双螺旋的两条链),每个基因至少有一个转录本。每个转录物具有转录起始位点(TSS),其是在核苷酸碱基对(bp)中测量的其染色体上转录物的整数位置。同一基因的两个转录本可能或许多不共享TSS。

在生物学方面,我想找到没有双向启动子的基因。这意味着我想找到所有基因,这些基因在相反的链的基因的任何转录起始位点的某些 n 内没有起始位点的转录本。作为旁注,为了便于举例,我选择了 n = 100 ,但生物学上更精确的 n 可能在150到1000的范围内。


示例数据

a = chromosome    b = strand    c = gene_id    d = transcript_id    e = tss
  chr1              +             ENSG001        ENST001             11865
  chr1              +             ENSG001        ENST002             11868
  chr1              +             ENSG001        ENST003             12006
  chr1              -             ENSG002        ENST004             29370
  chr1              -             ENSG002        ENST005             24886
  chr1              +             ENSG003        ENST006             29550

如果这是完整的数据列表且 n = 100 ,则所有行都将包含在答案中。但是,如果 n = 1000 ,则只应包含gene_id = ENSG001的前三行。


考虑

桌子很大,所以做一个巨大的笛卡儿,将它削减等等是不可行的(而且也很难看)。我可以使用哪种pandas / numpy方法来干净有效地选择符合我标准的行?我应该使用除groupby之外的其他内容,还是使用分层索引或其他内容?我对pandas语法并不是特别熟悉,所以非常感谢明确的例子。

谢谢!

0 个答案:

没有答案