Skip to main content
 首页 » 编程设计

python之获取组内的最大值,但不仅仅是第一个(ex æquo 也是如此)

2025年05月04日19youxin

我解释一下上下文:我有一个来自 Augustus 的输出(针对 2 个物种)有很多序列,我做了一个爆炸并得到了一组同源配对序列,我现在需要做的是只保留这些序列每个集群中的最高身份,甚至是以前的身份。 例如:

我实际上有一个数据框:

custer     seq 1       seq2        pident    whatever 
1           A           B           89          47 
1           A           B           89          68 
1           C           D           45          90 
2           E           F           79          25 
2           G           H           89          45 

…… 我想要得到的是:

custer     seq 1       seq2        pident    whatever 
1           A           B           89          47 
1           A           B           89          68 
2           G           H           89          45 

事实上,我想在每个集群中的 pident 列中保留最大值的行,但不仅仅是第一个,因为以下脚本会这样做:

data_grpd = data.groupby(['cluster']) 
result=data.loc[data_grpd['pident'].idxmax()] 

我得到:

custer     seq 1       seq2        pident    whatever 
1           A           B           89          47 
2           G           H           89          45 

换句话说,如果存在 ex æquo,我想将它们全部保留在每个集群中。

有人可以帮助我吗?

谢谢。

请您参考如下方法:

使用transform每组的 max 值与原始 DataFrame 大小相同,按 pident 列比较,最后按 boolean indexing 过滤:

data_grpd = data.groupby(['cluster']) 
result = data.loc[data_grpd['pident'].transform('max') == data['pident']] 
print (result) 
   cluster seq 1 seq2  pident  whatever 
0        1     A    B      89        47 
1        1     A    B      89        68 
4        2     G    H      89        45 

详细信息:

print (data_grpd['pident'].transform('max')) 
0    89 
1    89 
2    89 
3    89 
4    89 
Name: pident, dtype: int64 

编辑:一种可能的解决方案是先排序:

data_wo_eqSpec[['seq1','seq2']] = np.sort(data_wo_eqSpec[['seq1','seq2']], axis=1) 
 
data_grpd = data_wo_eqSpec.groupby(['cluster_name']) 
result = data_wo_eqSpec.loc[data_grpd['pident'].transform('max') == data_wo_eqSpec['pident']] 
print(result)