У меня есть следующий фрейм данных панд:
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, я обновил его. в основном я хочу указать индивидуальный порядок для столбцов уровня 0 и 1 для сортировки.
Вы можете создать мультииндекс необходимого вам порядка и переиндексировать столбцы с его помощью.
@sammywemmy нравится df.reindex(pd.MultiIndex.from_product([group_sort, field_sort]), axis=1)
? кажется, это может сработать
это просто не то, чего ты хочешь df.sort_index(axis = 1, ascending = False)
??
@Onyambu нет, я хочу указать списки для заказов. то, что предложил Сэммивемми, работает. спасибо обоим
Ага, понятно. ты не сортируешь. у вас уже есть заказ. Да, то, что было предложено, - это путь.
@sammywemmy, если вы хотите добавить свое предложение в качестве ответа, я с радостью отмечу его как ответ
Один из вариантов — комбинация переиндексации и сортировки_индекса:
(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
Вы забыли указать желаемый/ожидаемый результат