【问题标题】:Pandas get row names (sample names) from MultiindexPandas 从 Multiindex 获取行名(样本名)
【发布时间】:2017-02-07 12:30:11
【问题描述】:

假设一个数据框有这样一个索引:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用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
    

    【讨论】:

      猜你喜欢
      • 2020-05-10
      • 2020-06-12
      • 2022-06-14
      • 2017-05-04
      • 2019-01-26
      • 2017-11-15
      • 2015-06-13
      • 2019-01-26
      相关资源
      最近更新 更多