Изменение формы стола в пандах - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу изменить стол в пандах.У меня есть таблица вида:

date | country |state | population | num_cars
1    | c1      | s1   | 1          | 1
2    | c1      | s1   | 1          | 1
1    | c1      | s2   | 1          | 1
.
2    | c2      | s2   | 1          | 2
2    | c2      | s2   | 1          | 2

Я хочу превратить ее в эту форму:

date |1_population | c1_s1_population | c1_s2_population...| c2_s1_populationc1_num_cars |c2_11_num_cars...

Чтобы объяснить, исходные данные имеют поп и чисел по стране, штат длядиапазон дат.Теперь я хочу преобразовать количество столбцов временных рядов для каждого уровня (страна, страна-государство)

Как мне это сделать?

1 Ответ

0 голосов
/ 28 сентября 2019

В качестве выборки исходных данных я использовал 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 для столбцов - «Страна / население» и «Страна / номер автомобиля». Другой уровень содержит состояниеимена.

Чтобы отследить, как работает это решение, выполните каждый шаг отдельно и проверьте егощ.

...