我解释一下上下文:我有一个来自 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)
我是一名优秀的程序员,十分优秀!