Pandas从Multiindex获取行名(样本名称)

时间:2017-02-07 12:30:11

标签: python pandas

假设一个数据框的索引类似于:

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

或者是否有更优雅的解决方案?

1 个答案:

答案 0 :(得分: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