Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对一列进行分组,然后对数据帧中另一列的_值进行排序?_Python_Pandas - Fatal编程技术网

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分钟,所以肯定会有所不同。