На широком уровне вы хотите сделать что-то вроде этого:
df.pivot(index='country', columns='date', values=['GDP per capita' , 'Population']) \
.reorder_levels(['date', None], axis=1) \ # the multiindex doesn't get a name, so None
.sort_index(level=[0, 1], axis=1, ascending=[True, False])
Сначала вы делаете разворот. Затем измените порядок уровней, чтобы поставить дату вверху. Это создает нечто не совсем правильное, тогда как MultiIndex предоставляет запись для каждого отдельного элемента.
Итак, во-вторых, сортируйте индекс столбцов по уровням, чтобы сгруппировать их. И вы в конечном итоге с этим:
date 2015 2016 2017
Population GDP per capita Population GDP per capita Population GDP per capita
country
France 66593366.0 40564.460707 66859768.0 41357.986933 67118648.0 42850.386280
Germany 81686611.0 47810.836011 82348669.0 48943.101805 82695000.0 50638.890964
Italy 60730582.0 36640.115578 60627498.0 38380.172412 60551416.0 39426.940797
Spain 46444832.0 34818.120507 46484062.0 36305.222132 46572028.0 37997.852337
Кроме того, было бы замечательно найти способ легко читать ваши данные вместо того, чтобы собирать систему с помощью pd.read_csv(string_io_obj, sep='\s\s+')
, но это всего лишь небольшая ошибка.
Передав явные инструкции по сортировке для обоих уровней, вы также можете сделать level=1
для столбцов в обратном порядке, чтобы получить Население до ВВП на душу населения. Это может не сработать в других случаях, когда кому-то может потребоваться явное упорядочение, которое не совпадает с алфавитным (или наоборот).