我需要按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