Pivot расплавил Pandas DataFrame обратно в широкий обзор? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть DataFrame с именем df, который выглядит следующим образом: (где все значения являются строками):

        id        type       variable
---------------------------------------------
         A         a          item_1
         A         a          item_2
         A         a          item_3
         A         b          item_4
         A         b          item_5
         A         b          item_6
         A         c          item_7
         A         c          item_8
         A         c          item_9

Я хочу преобразовать его так:

type  a                     |b                       |c
id
------------------------------------------------------------------------------

A     item_1|item_2|item_3 | item_4 | item_5 |item_6| item_7 |item_8 | item_9

По сути, я хочу, чтобы столбцы type и variable были расположены в многоуровневом столбце.Это, очевидно, снимок, но в основном у меня есть 9 различных значений для каждого id в df

Я попробовал следующий код:

df.pivot(index = 'id', columns = 'type', values = 'variable')

Но получите следующую ошибку:

ValueError: Index contains duplicate entries, cannot reshape

Я уверен, что есть довольно простое решение, и я просто не думаю об этом!Буду признателен за любую помощь.Спасибо

1 Ответ

0 голосов
/ 26 апреля 2018

Создайте здесь вспомогательный ключ (с помощью cumcount) для устранения ошибки Index contains duplicate

df.assign(helpkey=df.groupby('type').cumcount()).set_index(['id','type','helpkey']).variable.unstack([-2,-1])
Out[138]: 
type          a                       b                       c          \
helpkey       0       1       2       0       1       2       0       1   
id                                                                        
A        item_1  item_2  item_3  item_4  item_5  item_6  item_7  item_8   
type             
helpkey       2  
id               
A        item_9  

Также мы можем использовать crosstab

pd.crosstab(index=df.id,columns=[df.type,df.groupby('type').cumcount()],values=df.variable,aggfunc='sum')
Out[144]: 
type        a                       b                       c                
col_1       0       1       2       0       1       2       0       1       2
id                                                                           
A      item_1  item_2  item_3  item_4  item_5  item_6  item_7  item_8  item_9

Или pivot_table:

df.assign(helpkey=df.groupby('type').cumcount()).pivot_table(index='id',columns=['type','helpkey'],values='variable', aggfunc='sum')
...