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



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

如果没有值至少大 3 倍,我需要返回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

我想要的输出如下所示:

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比 TP53.3 高 3 倍。

在第三行中,选择 BRCA2.2 是因为gene_count并列但feature_div更高。

不返回 1_1003_1034,因为gene_count不是其他选项的 3 倍,也没有比其他选项高feature_div

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

最新更新