在 pandas DataFrame 中设置 3 级列名

Set 3 level of column names in pandas DataFrame

我正在尝试使用具有以下结构的框架

              h/a                            totales

        sub1             sub2          sub1           sub2
   a  b ...   f         g ....m    a  b ...   f         g ....m           

也就是说,第一层有 2 个标签,第二层有 2 个标签,然后是列名称的子集,其中 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)

我该如何解决这个问题,使它具有按列名排列的多级框架?

谢谢

我认为需要 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