Pivot将Pandas DataFrame融化回广阔的视野?

时间:2018-04-25 21:28:46

标签: python-3.x pandas pivot

我有一个名为DataFrame的{​​{1}},如下所示:(所有值都是字符串):

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

中的每个id都有9个不同的值

我尝试过以下代码:

df

但是得到以下错误:

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

我确信有一个相当简单的解决方案,我只是没想到它!我将不胜感激任何帮助。感谢

1 个答案:

答案 0 :(得分:2)

在此处创建一个帮助键(使用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')