Pandas: сортировка многоуровневых столбцов

У меня есть следующий фрейм данных панд:

import pandas as pd
data1 = [['01/01/2000', 101, 201, 301],
        ['01/02/2000', 102, 202, 302],
        ['01/03/2000', 103, 203, 303],]
df1 = pd.DataFrame(data1, columns=['date', 'field1', 'field2', 'field3'])
df1 = df1.set_index('date')
data2 = [['01/01/2000', 101, 201, 301],
        ['01/02/2000', 102, 202, 302],
        ['01/03/2000', 103, 203, 303],]
df2 = pd.DataFrame(data2, columns=['date', 'field2', 'field1', 'field3'])
df2= df2.set_index('date')

df = pd.concat([df1, df2], keys = {'group1':df1, 'group2': df2 }, axis=1)
df

Это производит:

            group1                  group2
            field1  field2  field3  field2  field1  field3
date                        
01/01/2000  101     201     301     101     201     301
01/02/2000  102     202     302     102     202     302
01/03/2000  103     203     303     103     203     303

Я хотел бы отсортировать группу и поля по индивидуальному порядку. Для уровня 1 столбца я попробовал следующее:

group_sort=['group2', 'group1']
m = {k:v for k, v in enumerate(group_sort)}
df = df.sort_index(axis=1, key=lambda x: x.map(m), level=1)
df

В результате получается следующее, что по-прежнему соответствует исходному кадру данных:

            group1                  group2
            field2  field1  field3  field1  field2  field3
date                        
01/01/2000  101     201     301     101     201     301
01/02/2000  102     202     302     102     202     302
01/03/2000  103     203     303     103     203     303

Для уровня 0 (поля) я попробовал:

field_sort=['field3', 'field2', 'field1']
m = {k:v for k, v in enumerate(field_sort)}
df = df.sort_index(axis=1, key=lambda x: x.map(m), level=0)
df

Но это производит:

            group1  group2  group1  group2  group1  group2
            field1  field1  field2  field2  field3  field3
date                        
01/01/2000  201     101     101     201     301     301
01/02/2000  202     102     102     202     302     302
01/03/2000  203     103     103     203     303     303

Итак, мой вопрос: как мне отсортировать группу и поля? Есть ли более чистый, лаконичный или эффективный способ сделать это?

То, что я ожидаю в качестве вывода, отсортировано следующим образом:

            group2                  group1
            field3  field2  field1  field3  field2  field1
date                        
01/01/2000  301     201     101     301     201     101
01/02/2000  302     202     102     302     202     102
01/03/2000  303     203     103     303     203     103

Спасибо

Вы забыли указать желаемый/ожидаемый результат

Onyambu 06.04.2024 02:19

@Onyambu, я обновил его. в основном я хочу указать индивидуальный порядок для столбцов уровня 0 и 1 для сортировки.

mike01010 06.04.2024 02:32

Вы можете создать мультииндекс необходимого вам порядка и переиндексировать столбцы с его помощью.

sammywemmy 06.04.2024 02:36

@sammywemmy нравится df.reindex(pd.MultiIndex.from_product([group_sort, field_sort]), axis=1)? кажется, это может сработать

mike01010 06.04.2024 02:40

это просто не то, чего ты хочешь df.sort_index(axis = 1, ascending = False)??

Onyambu 06.04.2024 02:43

@Onyambu нет, я хочу указать списки для заказов. то, что предложил Сэммивемми, работает. спасибо обоим

mike01010 06.04.2024 02:45

Ага, понятно. ты не сортируешь. у вас уже есть заказ. Да, то, что было предложено, - это путь.

Onyambu 06.04.2024 02:46

@sammywemmy, если вы хотите добавить свое предложение в качестве ответа, я с радостью отмечу его как ответ

mike01010 06.04.2024 02:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из вариантов — комбинация переиндексации и сортировки_индекса:

(df
.reindex(labels=field_sort,axis=1,level=1)
.sort_index(level=0,axis=1, sort_remaining=False,ascending=False)
)
Out[23]:
           group2               group1
           field3 field2 field1 field3 field2 field1
date
01/01/2000    301    101    201    301    201    101
01/02/2000    302    102    202    302    202    102
01/03/2000    303    103    203    303    203    103

Более надежным вариантом было бы создать MultiIndex и переиндексировать его:

headers = ['group2','group1']
field_sort=['field3', 'field2', 'field1']
df.reindex(columns=pd.MultiIndex.from_product([headers,field_sort]))
Out[21]:
           group2               group1
           field3 field2 field1 field3 field2 field1
date
01/01/2000    301    101    201    301    201    101
01/02/2000    302    102    202    302    202    102
01/03/2000    303    103    203    303    203    103

Другие вопросы по теме

Похожие вопросы

Openpyxl, деактивировать вкладку, поэтому, когда пользователь открывает в Excel, активна только одна вкладка
Передайте «self» в функцию, определенную с помощью python exec в методе класса
Почему я получаю несовместимый указатель на преобразование целых чисел, инициализирующее «Py_ssize_t» на Mac M1?
Как установить gst-python в macOS для работы с рекомендуемыми установщиками GStreamer?
Когда я развертываю репозиторий приложения-функции в новом приложении, оно не распознает никакие функции Azure/Python/FunctionApp
Почему 0,00% отображается в первом столбце каждого столбца?
Как читать несколько файлов Excel, конвертировать их в отдельные файлы CSV без жесткого кодирования имени файла и пути в Python
Нелокальная переменная не обновляется, если возвращаемое значение рекурсивной функции не привязано к переменной:
S3 Minio: произошла ошибка (400) при вызове операции HeadBucket: неверный запрос"}
Итеративный расчет коэффициента наименьших квадратов в Python. Могу ли я что-нибудь сделать, чтобы ускорить свой код?