2015-10-20 72 views
2

我在将数据帧转换为新结构时遇到问题。 转向枢轴表到数据帧后,我的数据是这样的:转换数据帧(数据透视)

  model  model1  model2 
time  color  
2001-01 blue  200,000 120,000 
      red  100,000 100,000 
      yellow  250,000 80,000 
      white  100,000 100,000 
2002-01 blue  140,000 150,000 
      red  200,000 100,000 
      yellow  400,000 200,000 
      white  200,000 100,000 
... 

现在,这是我想要把它变成什么: 时间作为指标,每个模型的颜色鲜明的列。

  model1_blue model1_red model1_yellow model1_white model2_blue ... 
time  
2001-01 200,000  100,000  250,000  100,000  120,000 
2002-01 140,000  200,000  400,000  200,000  150,000 
... 

现在:这是如何工作:)?谢谢!

+0

是'model'索引与否? –

回答

1

假设model是一个指标,如果不是你可以简单地将其转换为使用

df.set_index('model' , inplace=True) 

转换模型索引是列,而不是

df_unstacked = df.unstack('model') 


Out[28]: 
     model1      model2 
model blue red  white yellow blue red  white yellow 
time         
2001-01 200,000 100,000 100,000 250,000 120,000 100,000 100,000 80,000 
2002-01 140,000 200,000 200,000 400,000 150,000 100,000 100,000 200,000 

检索两个级别

first_level_names = df_unstacked.columns.levels[0] 
second_level_names = df_unstacked.columns.levels[1] 
列名的索引

创建新列名称

new_columns = [ first+ '_' + second for first in first_level_names for second in second_level_names ] 

为您的数据框指定新的列名称

df_unstacked.columns = new_columns 

Out[33]: 
     model1_blue model1_red model1_white model1_yellow model2_blue model2_red model2_white model2_yellow 
time         
2001-01 200,000  100,000  100,000   250,000  120,000  100,000 100,000   80,000 
2002-01 140,000  200,000  200,000   400,000  150,000  100,000 100,000   200,000 
1

假设timemodel color正在形成一个分层索引(如果他们没有,你可以创建这个索引很容易与pd.MultiIndex.from_arrays),最简单的解决办法是“拆散”该索引:

import pandas as pd 
df = pd.DataFrame([ 
     [200, 120], 
     [201, 123], 
     [202, 124], 
     [203, 125] , 
     [204, 126] , 
     [205, 126] , 
     [205, 127], 
     [205, 127],   
    ], columns=["model1", "model2"]) 

df.index = pd.MultiIndex.from_product([["2001-01", "2001-02"], ["blue", "red", "yellow", "white"]]) 
df 

enter image description here

df.unstack() 

enter image description here