获取组内的最大值,但不仅仅是第一个(也是例外)

时间:2018-05-03 14:15:30

标签: python pandas dataframe

我解释了上下文:我有一个来自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

换句话说,如果有一个例外,我想将所有这些内容保留在每个群集中。

有人能帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:4)

对于与原始max大小相同的群组,使用transformDataFrame个值,按列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