Сводный / стековый фрейм данных Pandas без агрегации

#python-3.x #dataframe #stack #pivot #multi-index

#python-3.x #фрейм данных #стек #сводный #многоиндексный

Вопрос:

Я хочу развернуть pandas DataFrame без агрегации. Я пытался с pivot / stack но я не получаю именно то, что хотел.

 data = {'comp_id': ['0001', '0001', '0002', '0003', '0003', '0003'],
        'stk': ['0001', '0001B', '0002', '0003', '0003B', '62208'],
        'list_date': ['20150101', '20150331', '20130425', '20170401', '20170501', '20170601'],
        'ABH': ['A', 'B', 'B', 'A', 'B', 'H']}

df = pd.DataFrame(data)
df.set_index(['comp_id', 'ABH'])
print(df)

  comp_id    stk list_date ABH
0    0001   0001  20150101   A
1    0001  0001B  20150331   B
2    0002   0002  20130425   B
3    0003   0003  20170401   A
4    0003  0003B  20170501   B
5    0003  62208  20170601   H
 

Я хотел бы преобразовать эти данные, используя comp_id их в качестве индекса.
Мой желаемый результат DataFrame :

                      stk          |            list_date         
ABH          A        B       H   |     A          B           H     
comp_id                           |
---------------------------------------------------------------------
'0001'     '0001'  '0001B'        | '20150101' '20150331' 
'0002'              '0002'        |            '20130425'
'0003'     '0003'  '0003B' '62208'| '20170401' '20170501'  '20170601' 
 

Ответ №1:

 df = df.stack(level=[0], dropna=False)
df = df.unstack(level=[2, 1], fill_value='').sort_index(axis=1)
df = df[['stk', 'list_date']]
print(df)

          stk               list_date
ABH         A      B      H         A         B         H
comp_id
0001     0001  0001B         20150101  20150331
0002            0002                   20130425
0003     0003  0003B  62208  20170401  20170501  20170601