Скажем, у меня есть данные тестовых баллов студентов, где каждый студент изучает разные предметы. Каждый студент может пройти тест по каждому предмету несколько раз, и будет сохранен только самый высокий балл (из 100). Например, скажем, у меня есть данные всех тестовых записей:
| student_name | subject | test_number | score |
|--------------|---------|-------------|-------|
| sarah | maths | test1 | 78 |
| sarah | maths | test2 | 71 |
| sarah | maths | test3 | 83 |
| sarah | physics | test1 | 91 |
| sarah | physics | test2 | 97 |
| sarah | history | test1 | 83 |
| sarah | history | test2 | 87 |
| joan | maths | test1 | 83 |
| joan | maths | test2 | 88 |
(1) Как сохранить только записи теста (строки) с максимальной оценкой? То есть
| student_name | subject | test_number | score |
|--------------|---------|-------------|-------|
| sarah | maths | test1 | 78 |
| sarah | maths | test2 | 71 |
| sarah | maths | test3 | 83 |
| sarah | physics | test1 | 91 |
(2) Как бы я сохранил среднее всех тестов по одному и тому же предмету для одного и того же студента? То есть:
| student_name | subject | test_number | ave_score |
|--------------|---------|-------------|-----------|
| sarah | maths | na | 77.333 |
| sarah | maths | na | 94 |
| sarah | maths | na | 85 |
| sarah | physics | na | 85.5 |
Я пробовал различные комбинации df.sort_values()
и df.drop_duplicates(subset=..., keep=...)
, но безрезультатно.
Фактические данные
| query | target | pct-similarity | p-val | aln_length | bit-score |
|-------|----------|----------------|-------|------------|-----------|
| EV239 | B/Fw6/623 | 99.23 | 0.966 | 832 | 356 |
| EV239 | B/Fw6/623 | 97.34 | 0.982 | 1022 | 739 |
| EV239 | MMS-alpha | 92.23 | 0.997 | 838 | 384 |
| EV239 | MMS-alpha | 93.49 | 0.993 | 1402 | 829 |
| EV380 | B/Fw6/623 | 94.32 | 0.951 | 324 | 423 |
| EV380 | B/Fw6/623 | 95.27 | 0.932 | 1245 | 938 |
| EV380 | MMS-alpha | 99.23 | 0.927 | 723 | 522 |
| EV380 | MMS-alpha | 99.15 | 0.903 | 948 | 1092 |
После применения функции агрегирования будет интересен только столбец pct-similarity
.
(1) Удалить дубликаты запроса + целевые строки, выбрав максимальное значение aln_length
. Сохраните значение pct-similarity
, принадлежащее строке, с максимальным значением aln_length
.
(2) Агрегируйте повторяющиеся строки запроса + назначения, выбирая строку с максимальным значением aln_length
и вычисляя среднее значение pct-similarity
для этого набора повторяющихся строк. Другие числовые столбцы не нужны и будут в конечном итоге отброшены, поэтому мне действительно все равно, какая функция агрегации (максимальная или средняя) применяется к ним.