2017-03-05 39 views
1
index = [np.array(['foo', 'foo', 'qux']), 
     np.array(['a', 'b', 'a'])] 
data = np.random.randn(3, 2) 
columns = ["X", "Y"] 
df = pd.DataFrame(data, index=index, columns=columns) 
df.index.names = ["Level0", "Level1"] 
print df 

         X   Y 
Level0 Level1      
foo a  0.418549 0.252685 
     b  -1.307099 0.202833 
qux a  0.046095 -0.968976 

新的水平如何为MultiIndex添加关卡?

我想利用DF索引并创建一个新的多指标,现在有一个额外的水平。

new_level_name = "New level" 
new_level_labels = ['p', 'q'] 
# new_multi-index 

期望中的多指标

Level0 Level1 Level2      
foo a  p  
       q  
     b  p  
       q  
qux a  p  
       q  

回答

3

的simpliest是新的水平值,用stackDataFrame的列:

df1 = pd.DataFrame(data=1,index=df.index, columns=new_level_labels).stack() 
df1.index.names = ['Level0','Level1',new_level_name] 
print (df1) 
Level0 Level1 New level 
foo  a  p   1 
       q   1 
     b  p   1 
       q   1 
qux  a  p   1 
       q   1 
dtype: int64 

print (df1.index) 
MultiIndex(levels=[['foo', 'qux'], ['a', 'b'], ['p', 'q']], 
      labels=[[0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 1]], 
      names=['Level0', 'Level1', 'New level']) 
+0

啊布里尔!我曾尝试过几乎完全相同的东西,但没有包含数据= 1! – bluprince13

+1

是的,我也试过,但如果不是'1',那么默认'NaN'并且所有行都被删除。 – jezrael

相关问题