代码之家  ›  专栏  ›  技术社区  ›  puppet

在pandas数据框中设置3级列名

  •  1
  • puppet  · 技术社区  · 8 年前

    我想有一个框架,结构如下

                  h/a                            totales
    
            sub1             sub2          sub1           sub2
       a  b ...   f         g ....m    a  b ...   f         g ....m           
    

    也就是说,第一层有两个标签,第二层有两个标签,然后是列名的子集,其中sub1和sub2的列名不相同。

    为此,我做了以下工作:

    columnas=pd.MultiIndex.from_product([['h/a','totals'],['means','percentages'],
    [('means','a'),('means','b'),....('percentage','g'),....],
    names=['data level 1','data level 2','data level 3']])
    
    data=[data,pata,......]
    newframe=pd.DataFrame(data,columns=columnas)
    

    我得到的是这个错误:

    >ValueError: Shape of passed values is (1, 21), indices imply (84, 21)
    

    如何修复此问题,使其具有按列名排列的多级框架?

    谢谢你

    1 回复  |  直到 8 年前
        1
  •  1
  •   jezrael    8 年前

    我想需要 MultiIndex.from_tuples 从列表理解:

    L1 = list('abc')
    L2 = list('ghi')
    
    tups = ([('h/a','means', x) for x in L1] + 
           [('h/a','percentage', x) for x in L2] + 
           [('totals','means', x) for x in L1] + 
           [('totals','percentage', x) for x in L2])
    
    columnas=pd.MultiIndex.from_tuples(tups, names=['data level 1','data level 2','data level 3'])
    print (columnas)
    MultiIndex(levels=[['h/a', 'totals'], 
                       ['means', 'percentage'], 
                       ['a', 'b', 'c', 'g', 'h', 'i']],
               labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], 
                       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1], 
                       [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]],
               names=['data level 1', 'data level 2', 'data level 3'])
    
    #some random data
    np.random.seed(785)
    data = np.random.randint(10, size=(3, 12))
    print (data)
    [[8 0 4 1 2 5 4 1 4 1 1 8]
     [1 5 0 7 4 8 4 1 3 8 0 2]
     [5 9 4 9 4 6 3 7 0 5 2 1]]
    
    newframe=pd.DataFrame(data,columns=columnas)
    print (newframe)
    data level 1   h/a                        totals                       
    data level 2 means       percentage        means       percentage      
    data level 3     a  b  c          g  h  i      a  b  c          g  h  i
    0                8  0  4          1  2  5      4  1  4          1  1  8
    1                1  5  0          7  4  8      4  1  3          8  0  2
    2                5  9  4          9  4  6      3  7  0          5  2  1