Как изменить форму или транспонировать набор данных с учетом выбранных столбцов и строк в большом наборе данных (пример Всемирного банка)

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

введите здесь описание изображения

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

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

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

введите здесь описание изображения

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

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

введите здесь описание изображения

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


person Nicola    schedule 25.04.2020    source источник


Ответы (1)


Используйте DataFrame.set_index с изменением формы на < a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html" rel="nofollow noreferrer">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
person jezrael    schedule 25.04.2020