Python 如何对一列进行分组,然后对数据帧中另一列的_值进行排序?
我有一个熊猫数据框,看起来像:Python 如何对一列进行分组,然后对数据帧中另一列的_值进行排序?,python,pandas,Python,Pandas,我有一个熊猫数据框,看起来像: SampleID expr Gene Period tag 4 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615 2 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725 5 HSB100 3.214731 EN
SampleID expr Gene Period tag
4 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615
2 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725
5 HSB100 3.214731 ENSG00000198615 4 HSB100|ENSG00000198615
1 HSB106 2.200031 ENSG00000198780 5 HSB106|ENSG00000198780
0 HSB103 1.214731 ENSG00000198780 4 HSB103|ENSG00000198780
3 HSB103 0.214731 ENSG00000198615 4 HSB103|ENSG00000198615
SampleID expr Gene Period tag
0 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615
1 HSB100 3.214731 ENSG00000198615 4 HSB100|ENSG00000198615
2 HSB103 0.214731 ENSG00000198615 4 HSB103|ENSG00000198615
3 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725
4 HSB106 2.200031 ENSG00000198780 5 HSB106|ENSG00000198780
5 HSB103 1.214731 ENSG00000198780 4 HSB103|ENSG00000198780
我要做的是按基因分组
,然后按expr
降序排序,这样看起来像:
SampleID expr Gene Period tag
4 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615
2 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725
5 HSB100 3.214731 ENSG00000198615 4 HSB100|ENSG00000198615
1 HSB106 2.200031 ENSG00000198780 5 HSB106|ENSG00000198780
0 HSB103 1.214731 ENSG00000198780 4 HSB103|ENSG00000198780
3 HSB103 0.214731 ENSG00000198615 4 HSB103|ENSG00000198615
SampleID expr Gene Period tag
0 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615
1 HSB100 3.214731 ENSG00000198615 4 HSB100|ENSG00000198615
2 HSB103 0.214731 ENSG00000198615 4 HSB103|ENSG00000198615
3 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725
4 HSB106 2.200031 ENSG00000198780 5 HSB106|ENSG00000198780
5 HSB103 1.214731 ENSG00000198780 4 HSB103|ENSG00000198780
我尝试过以下方法,但都不起作用:
尝试1:
p4p5.sort_values(by=['expr'], ascending=[False], inplace=True).groupby(['Gene'])
p4p5.groupby(['Gene'])
p4p5.sort_values(by=['expr'], ascending=[False], inplace=True)
尝试2:
p4p5.sort_values(by=['expr'], ascending=[False], inplace=True).groupby(['Gene'])
p4p5.groupby(['Gene'])
p4p5.sort_values(by=['expr'], ascending=[False], inplace=True)
问题更新:
一旦我进行分组和排序,我如何才能过滤数据框,使每个基因组的表达量只剩下最后10%呢?当我说bottom10%
时,我的意思是在理论分布意义上,不是说如果我每个基因有100行,过滤后我会得到10行。我想会是这样的:
p4p5.sort_values(by=['Gene','expr'], ascending=[True,False], inplace=True).quantile([0.1])
这里不需要
groupby
,只需按两列对值进行排序,例如:
p4p5.sort_values(by=['Gene','expr'], ascending=[True,False], inplace=True)
编辑:对于更新的问题,您可以使用groupby
和tail
,例如:
p4p5_bottom10 = (p4p5.sort_values(by='expr', ascending=False).groupby('Gene')
.apply(lambda df_g: df_g.tail(int(len(df_g)*0.1))))
您也可以在末尾添加.reset\u index(drop=True)
第二次编辑:希望这次我理解得很好,你可以这样做:
#first sort
p4p5= p4p5.sort_values(['Gene','expr'], ascending=[True,False]).reset_index(drop=True)
# select the part of the data under quantile 10% (reset_index not mandatory)
p4p5_bottom10 = (p4p5[p4p5.groupby('Gene')['expr'].apply(lambda x: x < x.quantile(0.1))]
.reset_index(drop=True))
#第一类
p4p5=p4p5。排序_值(['Gene','expr'],升序=[True,False])。重置_索引(drop=True)
#选择分位数10%下的数据部分(重置索引不是强制性的)
p4p5_bottom10=(p4p5[p4p5.groupby('Gene')['expr'].apply(λx:x
简单的解决方案是:
>>> df.sort_values(['Gene','expr'],ascending=[True,False]).groupby('Gene').tail(3)
SampleID expr Gene Period tag
0 HSB103 7.214731 ENSG00000198615 5 HSB103|ENSG00000198615
2 HSB100 3.214731 ENSG00000198615 4 HSB100|ENSG00000198615
5 HSB103 1.214731 ENSG00000198615 4 HSB103|ENSG00000198615
1 HSB103 4.214731 ENSG00000198725 4 HSB103|ENSG00000198725
3 HSB106 2.200031 ENSG00000198780 5 HSB106|ENSG00000198780
4 HSB103 1.214731 ENSG00000198780 4 HSB103|ENSG00000198780
对于您更新的问题,您所说的过滤器是什么意思?您想删除数据帧的底部10%还是只保留这10%?我只保留底部10%您所说的“理论分布”是什么意思?不确定是否理解我的意思是,我希望在确定底部10%时考虑实际的表达式值,而不仅仅是选择每个基因的底部10行。例如,在R中,命令如下:
groupby(Gene)%%>%arrange(Gene,desc(expr))%%>%filter(expr
感谢您的更新!当我尝试打印p4p5\u bottom10时,我得到:空数据帧列:[SampleID,expr,Gene,Period,tag]索引:[]
@claudiadast这取决于每个组中有多少行。如果每个基因的行数少于10行,则将每个基因结果的底部10%获取为无数据,选择为int(len(df_g)*0.1)
为零,如果len(df_g)@claudiadast请参见我的第二次编辑,如果不是你想要的,我真的没有得到它;)直接在groupby
后面的tail
的问题是,要得到每个基因的底部10%(我是如何理解这个问题的),你需要确保所有的组都与tail
大小相同,只接受整数而不接受百分比(至少据我所知)@Ben.T,看起来像是我理解的最初的帖子,但从某种意义上说你是对的,所以你的答案会符合。问题已经编辑,我们都错了显然^^^是的,本:),这会发生,因为从那时起已经编辑了50分钟,所以肯定会有所不同。