问题(正式)
我有一个平面表 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 中
如果任何组 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语法并不是特别熟悉,所以非常感谢明确的例子。
谢谢!