熊猫:在groupby组中,如果最大值比任何其他值大至少3倍,则返回最大值

时间:2018-09-07 01:32:35

标签: python python-3.x pandas pandas-groupby

我需要按FeatureID列对数据帧进行分组,然后测试每个组以确定该组的gene_count列中的最大值是否至少大于其他{组中的{1}}个值。

如果没有任何值至少大于3倍,则需要返回gene_count列中具有最大值的行。

在这一点上,如果不存在最大为feature_div的行(也被绑在一起),也没有最大为gene_count的行,则不应返回该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

在第一行中,由于计数是绑定的,因此选择NTRK1.1,但它的 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 比TP53.1高。

在第二行中,由于feature_div比TP53.3高3倍,因此选择了MTOR.1。

在第三行中选择BRCA2.2是因为gene_count被并列,但它具有较高的gene_count

1_1003_1034未返回,因为feature_div的高度不超过其他选项的3倍,并且gene_count的高度不超过其他选项。

1 个答案:

答案 0 :(得分:1)

以下解决方案使用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