假设一个数据框的索引类似于:
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')
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']
或者是否有更优雅的解决方案?
答案 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