Порядок сортировки MultiIndex DataFrame после укладки столбцов в ряд - PullRequest
1 голос
/ 18 октября 2019

Проблемы во время sort_index после применения стека DataFrame:

У меня есть файл таблицы MS Excel, который выглядит следующим образом: ссылка на скриншот таблицы

Я читал его вDataFrame и получил ожидаемый результат:

df_test = pd.read_excel(io = path_test_xlsx, header = 0, index_col = 0) 
       US  AR   QA
Date                   
2015-01-01   1  10  100
2016-01-01   2  20  200
2017-01-01   3  30  300

Затем я сложил его в Series следующим образом:

ser_test = df_test.stack()
ser_test.index.names = ['Date', 'Country']
Date        Country
2015-01-01  US           1
            AR          10
            QA         100
2016-01-01  US           2
            AR          20
            QA         200
2017-01-01  US           3
            AR          30
            QA         300

Следующим шагом будет сортировка Series по Country , а затем Дата . Итак, я попробовал это:

print(ser_test.sort_index(level = ['Country', 'Date']))
Date        Country
2015-01-01  US           1
2016-01-01  US           2
2017-01-01  US           3
2015-01-01  AR          10
2016-01-01  AR          20
2017-01-01  AR          30
2015-01-01  QA         100
2016-01-01  QA         200
2017-01-01  QA         300

Мне кажется, проблема в процедуре стекирования, потому что следующий список манипуляций привел меня к успеху:

df_test_reseted = ser_test.reset_index(level = 'Country')
ser_test_reseted = df_test_reseted.set_index('Country', append = True).squeeze()
print(ser_test_reseted.sort_index(level = ['Country', 'Date']))
Date        Country
2015-01-01  AR          10
2016-01-01  AR          20
2017-01-01  AR          30
2015-01-01  QA         100
2016-01-01  QA         200
2017-01-01  QA         300
2015-01-01  US           1
2016-01-01  US           2
2017-01-01  US           3

Действительно ли процедура стека приводит к игнорированиюлексикографический порядок или я что-то не так сделал?

1 Ответ

1 голос
/ 18 октября 2019

Кажется, ошибка, потому что сортировка по меткам, а не по уровням. Если воссоздать MultiIndex, это работает хорошо:

print (ser_test.index.labels)
[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]]

print (ser_test.index.levels)
[['2015-01-01', '2016-01-01', '2017-01-01'], ['US', 'AR', 'QA']]

ser_test.index = pd.MultiIndex.from_tuples(ser_test.index.tolist(), names=['Date', 'Country'])
print(ser_test.sort_index(level = ['Country', 'Date']))
Date        Country
2015-01-01  AR          10
2016-01-01  AR          20
2017-01-01  AR          30
2015-01-01  QA         100
2016-01-01  QA         200
2017-01-01  QA         300
2015-01-01  US           1
2016-01-01  US           2
2017-01-01  US           3
dtype: int64

Другая идея - использовать этот трюк - преобразовать Серии в один столбец DataFrame и выбрать на последнем шаге 0:

print(ser_test.to_frame().sort_index(level=['Country', 'Date'])[0])
Date        Country
2015-01-01  AR          10
2016-01-01  AR          20
2017-01-01  AR          30
2015-01-01  QA         100
2016-01-01  QA         200
2017-01-01  QA         300
2015-01-01  US           1
2016-01-01  US           2
2017-01-01  US           3
Name: 0, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...