Панды: внутри групповых групп возвращают максимальное значение, если оно как минимум в 3 раза больше, чем любое другое значение - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно сгруппировать кадр данных по столбцу FeatureID, а затем проверить каждую группу, чтобы определить, является ли максимальное значение в столбце gene_count группы по крайней мере в 3 раза больше, чем любое из других значений gene_count в группа.

Если ни одно из значений не будет хотя бы в 3 раза больше, мне нужно вернуть строку с максимальным значением в столбце feature_div.

На этом этапе, если нет строки с max gene_count (иначе они все связаны) и нет строки с max feature_div, то этот FeatureID возвращать не следует.

Итак, логика псевдокода:

For each group in df.groupby("FeatureID"):
    If max(gene_count) 3x > all other gene_counts in group:
        return this row
    Elif:
        there is a max(feature_div) return this row
    Else:
        max(gene_count) is not >3 x higher than all other gene_counts in group
        and the feature_div scores are all tied
        pass   

Вот мой фрейм данных:

FeatureID     gene      feature_div  gene_count
1_1001_1028   NTRK1.1        2         2.0
1_1001_1028   TP53.1         1         2.0
1_1001_193    MTOR.1         1         9.0
1_1001_193    TP53.2         1         3.0
1_1003_1034   EGFR.1         3         4.0
1_1003_1034   EGFR.5         3         4.0
1_1008_823    ABL1.1         1         2.0
1_1008_823    BRCA2.2        2         2.0

Мой желаемый результат будет выглядеть так:

 FeatureID     gene      feature_div    gene_count
 1_1001_1028   NTRK1.1       2           2.0
 1_1001_193    MTOR.1        1           9.0
 1_1008_823    BRCA2.2       2           2.0

В первой строке NTRK1.1 выбирается, потому что счетчики связаны, но он имеет feature_div выше, чем TP53.1.

Во втором ряду выбирается MTOR.1, потому что gene_count в 3 раза выше, чем TP53.3.

В третьей строке выбрано BRCA2.2, поскольку gene_count связаны, но имеют более высокое значение feature_div.

1_1003_1034 не возвращается, потому что gene_count не в 3 раза выше, чем другие опции, и нет feature_div выше, чем другие опции.

1 Ответ

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

Следующее решение использует apply и пользовательскую функцию фильтрации для решения этой проблемы:

def filter_function(x):
    max_gene_counts = x.sort_values('gene_count', ascending=False).gene_count.head(2).values
    max_feature_divs = x.sort_values('feature_div', ascending=False).feature_div.head(2).values

    if max_gene_counts[0] >= 3 * max_gene_counts[1]:
        return x[x.gene_count == max_gene_counts[0]]
    elif max_feature_divs[0] > max_feature_divs[1]:
        return x[x.feature_div == max_feature_divs[0]]
    else:
        pass

df.groupby('FeatureID').apply(filter_function)

Результат:

  FeatureID      gene  feature_div  gene_count
1_1001_1028   NTRK1.1            2         2.0
 1_1001_193    MTOR.1            1         9.0
 1_1008_823   BRCA2.2            2         2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...