Как сгруппировать для одного столбца, а затем sort_values ​​для другого столбца в кадре данных pandas? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть кадр данных для панд, который выглядит следующим образом:

  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

Я хочу сгруппировать по Gene, а затем отсортировать по убыванию expr, чтобы он выглядел так:

  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'])

Попытка 2:

p4p5.groupby(['Gene'])
p4p5.sort_values(by=['expr'], ascending=[False], inplace=True)

Обновление до вопроса :

После того, как я сгруппирую и отсортирую, как я могу затем отфильтровать кадр данных, чтобы сохранить только самые нижние 10% экспрессии на группу генов? Когда я говорю bottom 10%, я имею в виду в смысле теоретического распределения, НЕ если бы у меня было 100 строк на ген, я бы получил 10 строк после фильтрации. Я полагаю, это будет что-то вроде:

p4p5.sort_values(by=['Gene','expr'], ascending=[True,False], inplace=True).quantile([0.1])

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Простое решение будет:

>>> 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
0 голосов
/ 06 ноября 2018

вам не нужно groupby здесь, просто sort_values по обоим столбцам, таким как:

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_index(drop=True) в конце тоже

2-е РЕДАКТИРОВАНИЕ: надеюсь, на этот раз я хорошо понял, вы можете сделать это так:

#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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...