В качестве выборки исходных данных я использовал DataFrame с 2 гипотетическими странами по 3 состояния в каждой:
date country state population num_cars
0 1990 Xxx Aaa 100 15
1 2010 Xxx Aaa 120 18
2 1990 Xxx Bbb 80 9
3 2010 Xxx Bbb 88 11
4 1990 Xxx Ccc 75 6
5 2010 Xxx Ccc 82 8
6 1990 Yyy Ggg 40 5
7 2010 Yyy Ggg 50 6
8 1990 Yyy Hhh 30 3
9 2010 Yyy Hhh 38 4
10 1990 Yyy Jjj 29 3
11 2010 Yyy Jjj 35 4
Чтобы решить вашу проблему, начните с определения функции переформатирования:
def reformat(grp, col):
pop = grp[col]
pop.name = grp.date.iloc[0]
return pop
Из группы строк ( grp ) он берет столбец с определенным именем ( col ), задает имя как date из первой строки (ключ группировки) и возвращает его.
В качестве начального шага сгруппируйте df по страна и состояние :
gr = df.set_index(['country', 'state']).groupby('date')
Затем вычислите 2 кадра данных в результате переформатирования (применяя вышеуказанную функцию к каждой группе, для обоих интересующих столбцов:
df1 = gr.apply(reformat, col='population')
df2 = gr.apply(reformat, col='num_cars')
И, получив два частичных результата, объедините их по индексам:
pd.merge(df1, df2, left_index=True, right_index=True,
suffixes=('_pop', '_cars'))
Результат:
country Xxx_pop Yyy_pop Xxx_cars Yyy_cars
state Aaa Bbb Ccc Ggg Hhh Jjj Aaa Bbb Ccc Ggg Hhh Jjj
date
1990 100 80 75 40 30 29 15 9 6 5 3 3
2010 120 88 82 50 38 35 18 11 8 6 4 4
Как видите, верхний уровень MultiIndex для столбцов - «Страна / население» и «Страна / номер автомобиля». Другой уровень содержит состояниеимена.
Чтобы отследить, как работает это решение, выполните каждый шаг отдельно и проверьте егощ.