Изменить форму стека / распаковки фрейма данных pandas

df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','USA','CANADA','MEXICO','INDIA','CHINA','JAPAN' ], 'ASID':[21, 32, 99, 77,66,55,44,88,111], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99], 'PRICE1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6], 'PRICE2':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'PRICE3':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6] })

df = df[['ASID', 'BORDER', 'HOUR1', 'PRICE1', 'HOUR2', 'PRICE2', 'HOUR3', 'PRICE3']]

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

Желаемый результат имеет следующие столбцы:

ASID, BORDER, HOUR, PRICE

Я хочу сложить все ['HOUR1', 'HOUR2', HOUR3'] в один column = HOUR.

Точно так же я хочу сложить все ['PRICE1', 'PRICE2', 'PRICE3'] в один column = PRICE, чтобы значение в этом поле было выровнено с соответствующим значением в столбце HOUR. Существует связь между HOUR1 и PRICE1, HOUR2 и PRICE2, HOUR3 и PRICE3.

Я ценю любые рекомендации, которые вы можете предоставить.


person codingknob    schedule 07.06.2015    source источник


Ответы (1)


Исходные данные (обратите внимание на исправление «PRICE1» во второй строке).

df = pd.DataFrame({'BORDER':['GERMANY','FRANCE','ITALY','USA','CANADA','MEXICO','INDIA','CHINA','JAPAN' ], 'ASID':[21, 32, 99, 77,66,55,44,88,111], 'HOUR1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'HOUR2':[3 ,3 ,3, 5 ,5 ,5, 7, 7, 7], 'HOUR3':[8 ,8 ,8, 12 ,12 ,12, 99, 99, 99], 'PRICE1':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6], 'PRICE2':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6],'PRICE3':[2 ,2 ,2 ,4 ,4 ,4 ,6 ,6, 6] })

df = df[['ASID', 'BORDER', 'HOUR1', 'PRICE1', 'HOUR2', 'PRICE2', 'HOUR3', 'PRICE3']]

Сначала установите индекс на ASID и BORDER.

df.set_index(['ASID', 'BORDER'], inplace=True)

Затем создайте два кадра данных для цен и часов, суммируя результаты. Удалите уровни часов и цен из этих сложенных фреймов данных.

prices = df[['PRICE1','PRICE2', 'PRICE3']].stack()
prices.index = prices.index.droplevel(2)
hours = df[['HOUR1', 'HOUR2', 'HOUR3']].stack()
hours.index = hours.index.droplevel(2)

Наконец, объедините эти два кадра данных и переименуйте столбцы.

df_new = pd.concat([hours, prices], axis=1)
df_new.columns = ['HOUR', 'PRICE']

>>> df_new
              HOUR  PRICE
ASID BORDER              
21   GERMANY     2      2
     GERMANY     3      2
     GERMANY     8      2
32   FRANCE      2      2
     FRANCE      3      2
     FRANCE      8      2
99   ITALY       2      2
     ITALY       3      2
     ITALY       8      2
77   USA         4      4
     USA         5      4
     USA        12      4
66   CANADA      4      4
     CANADA      5      4
     CANADA     12      4
55   MEXICO      4      4
     MEXICO      5      4
     MEXICO     12      4
44   INDIA       6      6
     INDIA       7      6
     INDIA      99      6
88   CHINA       6      6
     CHINA       7      6
     CHINA      99      6
111  JAPAN       6      6
     JAPAN       7      6
     JAPAN      99      6
person Alexander    schedule 07.06.2015
comment
любить это. Большое спасибо. Ценить это. - person codingknob; 07.06.2015