Мое предложение состоит в том, чтобы изменить ваше решение следующим образом:
Шаг 1: df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2])
,
как ты.
Оставляет столбцы в следующей форме:
PX_LAST PX_OPEN PX_CLOSE
ticker A B A B A B
source LSE LSE LSE LSE LSE LSE
(и timestamp
в качестве индекса).
Шаг 2: reorder_levels([1, 2, 0], axis=1)
вместо ваших 2
swaplevel
инструкции.
Оставляет столбцы как:
ticker A B A B A B
source LSE LSE LSE LSE LSE LSE
PX_LAST PX_LAST PX_OPEN PX_OPEN PX_CLOSE PX_CLOSE
И последний шаг sort_index(axis=1, level=[0,1], sort_remaining=False)
Обратите внимание, что вы сортируете только уровень 0 и 1, поэтому порядок на последнем уровне
остается без изменений (PX_LAST, PX_OPEN, PX_CLOSE).
Таким образом, весь сценарий (то есть одна инструкция):
df2 = df.set_index(['timestamp', 'ticker', 'source']).unstack([1, 2])\
.reorder_levels([1, 2, 0], axis=1)\
.sort_index(axis=1, level=[0,1], sort_remaining=False)
Когда вы напечатаете результат, вы получите:
ticker A B
source LSE LSE
PX_LAST PX_OPEN PX_CLOSE PX_LAST PX_OPEN PX_CLOSE
timestamp
20180101 1 2 3 7 8 9
20180102 4 5 6 10 11 12