Как изменить форму или транспонировать набор данных, рассматривая выбранные столбцы и строки в большом наборе данных (пример Всемирного банка) - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь свернуть набор данных с веб-сайта Всемирного банка, и мне нужно изменить форму так, чтобы название серии было первой строкой, а годы были структурированы по столбцу. В наборе данных имеется 50 лет и более 100 индикаторов, так что для этого изменения требуется некоторая форма автоматизации, чтобы работать на меня. Выдержка из фактического набора данных выглядит следующим образом:

enter image description here

Чтобы упростить процесс изменения формы, я также делюсь воспроизводимым кодом для покажите переход, который я имею в виду, с точки зрения расположения столбцов и строк, как показано в повествовательной форме.

Обратите внимание : Воспроизводимый код не является идеальным представлением выходных данных, поскольку он очень сильно упрощен, а фактический набор данных, который воспроизводится, имеет сотни индикаторов и сотни стран

import pandas as pd
data = {'Country':  ['Argentina', 'Argentina', 'Albania','Albania','Cuba','Cuba'],
        'Series': ['Indicator 1', 'Indicator 2', 'Indicator 1', 'Indicator 2','Indicator 1', 'Indicator 2', ],
        '2014': [1, 2, 3,4,5,6],
        '2015': [2, 4, 1,2,3,4]}
df = pd.DataFrame (data, columns = ['Country','Series','2014','2015'])
df

enter image description here

И я хотел бы использовать фрагмент для достижения этой структуры, как показано в выходных данных под кодом

import pandas as pd
data = {'Country':  ['Argentina', 'Argentina', 'Albania','Albania','Cuba','Cuba'],
        'Year': [2014,2015,2014,2015,2014,2015],
        'Indicator 1': [1, 2,3,1,5,3],
        'Indicator 2': [2,4,4,2,6,4]}
df = pd.DataFrame (data, columns = ['Country','Year','Indicator 1','Indicator 2'])
df

enter image description here

Я ищу быстрый фрагмент, чтобы достичь моего результата без слишком больших затрат времени на решение по столбцам. Спасибо!

1 Ответ

1 голос
/ 25 апреля 2020

Используйте DataFrame.set_index с изменением формы на DataFrame.stack и Series.unstack:

df1 = (df.set_index(['Country','Series'])
         .stack()
         .unstack(1)
         .rename_axis(columns=None, index=('Country','Year'))
         .reset_index())
print (df1)
     Country  Year  Indicator 1  Indicator 2
0    Albania  2014            3            4
1    Albania  2015            1            2
2  Argentina  2014            1            2
3  Argentina  2015            2            4
4       Cuba  2014            5            6
5       Cuba  2015            3            4

Если не работает из-за дублирования используйте DataFrame.melt с DataFrame.pivot_table (возможные дубликаты агрегируются по mean):

df1 = (df.melt(['Country','Series'], var_name='Year')
         .pivot_table(index=['Country','Year'], 
                      columns='Series', 
                      values='value',
                      aggfunc='mean')
         .rename_axis(columns=None, index=('Country','Year'))
         .reset_index()
         )
print (df1)
     Country  Year  Indicator 1  Indicator 2
0    Albania  2014            3            4
1    Albania  2015            1            2
2  Argentina  2014            1            2
3  Argentina  2015            2            4
4       Cuba  2014            5            6
5       Cuba  2015            3            4
...