2017-02-07 77 views
1

假設其中有這樣一個索引的數據幀:大熊貓從多指標得到行的名稱(樣品名稱)

df = pd.DataFrame(np.array([[1,2,3,4],[4,5,6,1],['A','B','C','A'],['a','b','a','b']]).T,columns=['d1','d2','type','subtype']) 
df.set_index(['type', 'subtype','d1']).unstack('d1') 

enter image description here

df = pd.DataFrame(np.array([[1,2,3,4],[4,5,6,1],['A','B','C','A'],['a','b','a','b']]).T,columns=['d1','d2','type','subtype']) 
df = df.set_index(['type', 'subtype','d1']).unstack('d1') 
df.index 

MultiIndex(levels=[['A', 'B', 'C'], ['a', 'b']], 
      labels=[[0, 0, 1, 2], [0, 1, 1, 0]], 
      names=['type', 'subtype']) 

我使用數據框的值,一些分析(如PCA)。以後,我想繪製結果並根據索引命名點。我知道行名稱的信息由多重索引中的關卡和標籤提供。我怎樣才能生成一個列表給我每個樣本的名稱(例如['Aa','Ab','Bb','Ca'])?

難道我真的要做到這一點:?

l1 = df.index.get_level_values(0).values.tolist() 
l2 = df.index.get_level_values(1).values.tolist() 
[i1 + i2 for i1, i2 in zip(l1,l2)] 

將會產生我:

['Aa', 'Ab', 'Bb', 'Ca'] 

或者是有一個更優雅的解決方案?

回答

3

您可以使用map

df.index = df.index.map(''.join) 
print (df) 
     d2     
d1  1  2  3  4 
Aa  4 None None None 
Ab None None None  1 
Bb None  5 None None 
Ca None None  6 None 

或列表理解:

df.index = [''.join(idx) for idx in df.index] 
print (df) 
     d2     
d1  1  2  3  4 
Aa  4 None None None 
Ab None None None  1 
Bb None  5 None None 
Ca None None  6 None 

解決方案與str.join

df.index = df.index.to_series().str.join('') 
print (df) 
     d2     
d1  1  2  3  4 
Aa  4 None None None 
Ab None None None  1 
Bb None  5 None None 
Ca None None  6 None