如何转动数据框

时间:2017-11-09 07:28:37

标签: pandas

我正试图根据ID字段来旋转(或取消堆叠?)数据框,如下所示:

ID  Col1    Col2
1   a   aa
2   b   bb
3   c   cc
3   d   dd

对此:

ID  Col1    Col2    Col1    Col2
1   a   aa      
2   b   bb      
3   c   cc           d      dd

所以我正在尝试:

df2 = df.pivot(None, 'ID')

这给了我错误:

  

builtins.IndexError:索引1796516957超出了轴0的范围   大小1796298784

我做错了什么?

1 个答案:

答案 0 :(得分:1)

MultiIndex列使用cumcount + set_index + unstack

a = df.groupby('ID').cumcount().astype(str)
df = df.set_index(['ID', a]).unstack(fill_value='').sort_index(level=1, axis=1)

替代apply

c = ['Col1','Col2']
df = (df.groupby('ID')[c]
       .apply(lambda x: pd.DataFrame(x.values, columns=c))
       .unstack(fill_value='')
       .sort_index(level=1, axis=1))
print (df)
   Col1 Col2 Col1 Col2
      0    0    1    1
ID                    
1     a   aa          
2     b   bb          
3     c   cc    d   dd

对于重复列名称,请使用droplevel

df.columns = df.columns.droplevel(1)
print (df)

   Col1 Col2 Col1 Col2
ID                    
1     a   aa          
2     b   bb          
3     c   cc    d   dd

对于唯一列名称,请使用join

df.columns = df.columns.map('_'.join)
print (df)

   Col1_0 Col2_0 Col1_1 Col2_1
ID                            
1       a     aa              
2       b     bb              
3       c     cc      d     dd