2017-02-07 2 views
1

предположит dataframe, который имеет индекс, как этот:Панды получить имена строк (имена образцов) из мультииндексных

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']) 

Я использую значение dataframe для некоторого анализа (например, 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 
Смежные вопросы