我需要按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
的高度不超过其他选项。
答案 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