我解释了上下文:我有一个来自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
换句话说,如果有一个例外,我想将所有这些内容保留在每个群集中。
有人能帮助我吗?
谢谢。
答案 0 :(得分:4)
对于与原始max
大小相同的群组,使用transform
个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)
答案 1 :(得分:1)
使用.apply()
的另一种方法,虽然它没有@ jezrael的方法那么快:
(df.groupby('cluster')
.apply(lambda x: x.loc[x.pident == x.pident.max()])
.reset_index(drop=True))
返回:
cluster seq1 seq2 pident whatever
0 1 A B 89 47
1 1 A B 89 68
2 2 G H 89 45