Pandas: группируйте и сортируйте весь фрейм данных на основе значений двух столбцов, сохраняя порядок внутри группы.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pandas: группируйте и сортируйте весь фрейм данных на основе значений двух столбцов, сохраняя порядок внутри группы.

Сообщение Anonymous »

У меня есть такой DataFrame pandas:

Код: Выделить всё

sample  closest_signature   distance    patient cluster correlation biopsy  similarity  n_biopsy
0   21506-A HU.1    0.416795    21506   HU.1    0.994611    A   2.399261    2.0
1   21506-B HU.1    0.340269    21506   HU.1    0.993852    B   2.938855    2.0
2   21507-A HU.3    0.181289    21507   HU.3    0.868993    A   5.516052    3.0
3   21507-B HU.3    0.128398    21507   HU.3    0.972968    B   7.788282    3.0
4   21507-C HU.3    0.117186    21507   HU.3    0.949540    C   8.533432    3.0
5   21521-A HU.2    0.111720    21521   HU.2    0.956889    A   8.950942    2.0
6   21521-B HU.2    0.116082    21521   HU.2    0.974804    B   8.614610    2.0
7   21531-A HU.4    0.251558    21531   ND  0.560867    A   3.975227    2.0
8   21531-B HU.2    0.197108    21531   HU.2    0.890214    B   5.073356    2.0
9   21543-A HU.2    0.184331    21543   HU.2    0.973885    A   5.425033    6.0
10  21543-B HU.2    0.151444    21543   HU.2    0.990204    B   6.603119    6.0
11  21543-C HU.2    0.156038    21543   HU.2    0.989900    C   6.408698    6.0
12  21543-D HU.2    0.196920    21543   HU.2    0.939929    D   5.078191    6.0
13  21543-E HU.1    0.234311    21543   HU.1    0.980673    E   4.267841    6.0
14  21543-F HU.2    0.152050    21543   HU.2    0.989276    F   6.576796    6.0
Моя цель — отсортировать весь фрейм данных, например:
  • Записи должны быть упорядочен по ближайшему_подписи, как определено для примера, оканчивающегося на A (другими словами, самое близкое значение для использования в качестве ключа — это одно из значений -A< /code> образец для каждой группы, например, если 21543-A — HU.2, то это HU.2, даже если другие образцы в той же группе могут отличаться)
    Группы пациентов должны быть отсортированы по наибольшему n_biopsy, но с сохранением порядка в группе (т. е. образцы должны быть упорядочены от А до Я)< /li>
Ожидаемый результат:

Код: Выделить всё

sample  closest_signature   distance    patient cluster correlation biopsy  similarity  n_biopsy
0   21506-A HU.1    0.416795    21506   HU.1    0.994611    A   2.399261    2.0
1   21506-B HU.1    0.340269    21506   HU.1    0.993852    B   2.938855    2.0
9   21543-A HU.2    0.184331    21543   HU.2    0.973885    A   5.425033    6.0
10  21543-B HU.2    0.151444    21543   HU.2    0.990204    B   6.603119    6.0
11  21543-C HU.2    0.156038    21543   HU.2    0.989900    C   6.408698    6.0
12  21543-D HU.2    0.196920    21543   HU.2    0.939929    D   5.078191    6.0
13  21543-E HU.1    0.234311    21543   HU.1    0.980673    E   4.267841    6.0
14  21543-F HU.2    0.152050    21543   HU.2    0.989276    F   6.576796    6.0
5   21521-A HU.2    0.111720    21521   HU.2    0.956889    A   8.950942    2.0
6   21521-B HU.2    0.116082    21521   HU.2    0.974804    B   8.614610    2.0
2   21507-A HU.3    0.181289    21507   HU.3    0.868993    A   5.516052    3.0
3   21507-B HU.3    0.128398    21507   HU.3    0.972968    B   7.788282    3.0
4   21507-C HU.3    0.117186    21507   HU.3    0.949540    C   8.533432    3.0
7   21531-A HU.4    0.251558    21531   ND  0.560867    A   3.975227    2.0
8   21531-B HU.2    0.197108    21531   HU.2    0.890214    B   5.073356    2.0
Если я не включу ближайшую_подпись, подход будет очень простым:

Код: Выделить всё

df = df.sort_values(["n_biopsy", "patient" ], ascending=[False, True])
df.head(10)

sample  closest_signature   distance    patient cluster correlation biopsy  similarity  n_biopsy
9   21543-A HU.2    0.184331    21543   HU.2    0.973885    A   5.425033    6
10  21543-B HU.2    0.151444    21543   HU.2    0.990204    B   6.603119    6
11  21543-C HU.2    0.156038    21543   HU.2    0.989900    C   6.408698    6
12  21543-D HU.2    0.196920    21543   HU.2    0.939929    D   5.078191    6
13  21543-E HU.1    0.234311    21543   HU.1    0.980673    E   4.267841    6
14  21543-F HU.2    0.152050    21543   HU.2    0.989276    F   6.576796    6
32  21564-A HU.3    0.121428    21564   HU.3    0.975599    A   8.235334    6
33  21564-B HU.3    0.114477    21564   HU.3    0.978366    B   8.735386    6
34  21564-C HU.3    0.149845    21564   HU.3    0.983692    C   6.673560    6
35  21564-D HU.3    0.139047    21564   HU.3    0.949370    D   7.191837    6
Однако это, конечно, начинается с HU.2 вместо HU.1.
Я пробовал сделать составной ключ, смешивающий ближайшую_подпись с первой записью A каждой группы с количеством биопсий (например, 6_HU.1), но я снова сталкиваюсь с проблемой курицы и яйца, потому что ближайшая_подпись нужно отсортировать по возрастанию, а количество биопсий по убыванию:

Код: Выделить всё

for gid, group in df.groupby("patient"):
num_biopsy = group["n_biopsy"].unique().item()
cluster = group.loc[group.index[0], "closest_signature"]
value = f"{num_biopsy}_{cluster}"
df.loc[group.index, "biopsy_cluster"] = value
df.sort_values(["biopsy_cluster", "patient"], ascending=[False, True])

sample  closest_signature   distance    patient cluster correlation biopsy  similarity  n_biopsy    biopsy_cluster
32  21564-A HU.3    0.121428    21564   HU.3    0.975599    A   8.235334    6   6_HU.3
33  21564-B HU.3    0.114477    21564   HU.3    0.978366    B   8.735386    6   6_HU.3
34  21564-C HU.3    0.149845    21564   HU.3    0.983692    C   6.673560    6   6_HU.3
35  21564-D HU.3    0.139047    21564   HU.3    0.949370    D   7.191837    6   6_HU.3
36  21564-E HU.3    0.125473    21564   HU.3    0.969198    E   7.969847    6   6_HU.3
Обратите внимание, что первым является HU.3. Все другие подходы, которые я пробовал, теряют порядок внутри групп, который очень важно сохранять.
Выполнимо ли то, что я пытаюсь сделать?

Подробнее здесь: https://stackoverflow.com/questions/788 ... lumns-pres
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»