Pandas dataframe, как группировать по значению, сортировать по убыванию, а затем фильтровать в квантиль (0.1) - PullRequest
0 голосов
/ 07 ноября 2018

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

    SampleID      expr             Gene  Period                     tag  \
1    HSB666  3.663308  ENSG00000147996       5  HSB666|ENSG00000147996   
2    HSB666  3.663308  ENSG00000147996       5  HSB666|ENSG00000147996   
3    HSB666  3.663308  ENSG00000147996       5  HSB666|ENSG00000147996   
4    HSB666  3.663308  ENSG00000147996       5  HSB666|ENSG00000147996   
5    HSB651  3.207474  ENSG00000174749       4  HSB651|ENSG00000174749   
6    HSB651  3.207474  ENSG00000174749       4  HSB651|ENSG00000174749   
7    HSB651  3.207474  ENSG00000174749       4  HSB651|ENSG00000174749   
8    HSB651  3.207474  ENSG00000174749       4  HSB651|ENSG00000174749   
9    HSB651  3.207474  ENSG00000174749       4  HSB651|ENSG00000174749   
10   HSB195  0.214731  ENSG00000188157       4  HSB195|ENSG00000188157   
11   HSB195  0.214731  ENSG00000188157       4  HSB195|ENSG00000188157   
12   HSB195  0.214731  ENSG00000188157       4  HSB195|ENSG00000188157   
14   HSB152  5.062444  ENSG00000188157       4  HSB152|ENSG00000188157   
15   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
16   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
17   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
18   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
19   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
20   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
21   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
22   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   
23   HSB627  2.062444  ENSG00000174749       4  HSB627|ENSG00000174749   

              Consequence  
1   upstream_gene_variant  
2   upstream_gene_variant  
3   upstream_gene_variant  
4   upstream_gene_variant  
5   upstream_gene_variant  
6   upstream_gene_variant  
7   upstream_gene_variant  
8   upstream_gene_variant  
9   upstream_gene_variant  
10  upstream_gene_variant  
11  upstream_gene_variant  
12  upstream_gene_variant  
14  upstream_gene_variant  
15  upstream_gene_variant  
16  upstream_gene_variant  
17  upstream_gene_variant  
18  upstream_gene_variant  
19  upstream_gene_variant  
20  upstream_gene_variant  
21  upstream_gene_variant  
22  upstream_gene_variant  
23         intron_variant 

Теперь я хочу сгруппировать по Gene, отсортировать по убыванию expr, а затем отфильтровать фрейм данных по строкам, которые находятся в нижних 10% expr значений PER Gene группы (10-й процентиль ). Поэтому я выполняю следующее:

1) Сортировка по убыванию expr (SUCCEEDS)

p4p5_sort= p4p5_merge.sort_values(['expr', 'Gene'],
           ascending=[False, True]).reset_index(drop=True)

2) Группировка по гену и фильтрация для нижних 10% экспрессии / гена (FAILS)

p4p5_bottom10  = (p4p5_sort[p4p5_sort.groupby('Gene')['expr'].
                 apply(lambda x: x < x.quantile(0.1))])

Шаг 1 работает так, как он должен, но когда я запускаю Шаг 2, я просто получаю следующий ответ:

sys:1: DtypeWarning: Columns (15,16,22,36,37,38,39) have mixed types. Specify dtype option on import or set low_memory=False.
Empty DataFrame
Columns: [SampleID, expr, Gene, Period, tag, Consequence]
Index: []

Если это поможет, R-эквивалент того, чего я пытаюсь достичь, это:

p4p5_bottom10 <- p4p5_merge %>% select(Gene, expr, SampleID, Period) %>%
    group_by(Gene) %>% 
    arrange(Gene, desc(expr)) %>%
    filter(expr < quantile(expr, 0.1))

1 Ответ

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

Вы можете применить свой квантиль непосредственно к гроубу следующим образом:
p4p5_bottom10 = pd.DataFrame(p4p5_sort.groupby(['Gene'])['expr'].quantile(0.1))

Мы должны применить pd.DataFrame () для преобразования в DF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...