Получить максимальные значения в группах, но не только в первом (например, в «æquo») - PullRequest
0 голосов
/ 03 мая 2018

Я объясняю контекст: у меня есть выход Августа (для 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 голосов
/ 03 мая 2018

Еще один способ сделать это, используя .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
0 голосов
/ 03 мая 2018

Используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...