How can I convert a dictionary to a layered dataframe?

Given:

A = pd.DataFrame([[1, 5, 2, 8, 2], [2, 4, 4, 20, 2], [3, 3, 1, 20, 2], [4, 2, 2, 1, 0], 
              [5, 1, 4, -5, -4], [1, 5, 2, 2, -20], [2, 4, 4, 3, 0], [3, 3, 1, -1, -1], 
              [4, 2, 2, 0, 0], [5, 1, 4, 20, -2]],
             columns=['a', 'b', 'c', 'd', 'e'],
             index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

B = pd.DataFrame([[0, 0, 0, 8, 2], [1, 1, 1, 1, 1], [0, 0, 0, 8, 2], [0, 0, 2, 1, 0], 
              [5, 1, 4, -5, -4], [0, 0, 0, 8, 2], [2, 4, 4, 3, 0], [1, 3, 1, -1, -1], 
              [1, 1, 2, 0, 0], [2, 2, 2, 20, -2]],
             columns=['a', 'b', 'c', 'd', 'e'],
             index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

test_list = [('test1', A), ('test2', B)]
d_test = dict(test_list)

      

Then I ran into difficulties when trying to convert this dictionary into a multi-level file frame. But I don't know how to specify multi-level, I want "key" to be the name of the dataframe at the second level. This is the desired exit

df

    test_1              test_2
    a   b   c   d   e   a   b   c   d   e
1   1   5   2   8   2   0   0   0   8   2
2   2   4   4   20  2   1   1   1   1   1
3   3   3   1   20  2   0   0   0   8   2
4   4   2   2   1   0   0   0   2   1   0
5   5   1   4   -5  -4  5   1   4   -5  -4
6   1   5   2   2   -20 0   0   0   8   2
7   2   4   4   3   0   2   4   4   3   0
8   3   3   1   -1  -1  1   3   1   -1  -1
9   4   2   2   0   0   1   1   2   0   0
10  5   1   4   20  -2  2   2   2   20  -2

      

+3


source to share


1 answer


Just to have an answer here (which was already pointed out in the comments), here it goes (again):

import pandas as pd
A = pd.DataFrame([[1, 5, 2, 8, 2], [2, 4, 4, 20, 2], [3, 3, 1, 20, 2], [4, 2, 2, 1, 0], 
              [5, 1, 4, -5, -4], [1, 5, 2, 2, -20], [2, 4, 4, 3, 0], [3, 3, 1, -1, -1], 
              [4, 2, 2, 0, 0], [5, 1, 4, 20, -2]],
             columns=['a', 'b', 'c', 'd', 'e'],
             index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
B = pd.DataFrame([[0, 0, 0, 8, 2], [1, 1, 1, 1, 1], [0, 0, 0, 8, 2], [0, 0, 2, 1, 0], 
              [5, 1, 4, -5, -4], [0, 0, 0, 8, 2], [2, 4, 4, 3, 0], [1, 3, 1, -1, -1], 
              [1, 1, 2, 0, 0], [2, 2, 2, 20, -2]],
             columns=['a', 'b', 'c', 'd', 'e'],
             index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
AB=pd.concat([A,B], axis=1)
header = ['test1','test1','test1','test1','test1','test2','test2','test2','test2','test2']
AB.columns = pd.MultiIndex.from_tuples(list(zip(header, AB.columns)))
print(AB) # gives what was asked for 
print("test1: \n", AB.test1) # gives A
print("test2: \n", AB.test2) # gives B

      

Another (up to a real situation) way of achieving the same (the answer is given in the comments above):



test_list = [('test1', A), ('test2', B)]
d_test = dict(test_list)
AB = pd.concat(d_test.values(), keys=d_test.keys(), axis=1) 
# what means: AB = pd.concat([A,B], keys=['test1', 'test2'], axis=1) 

      

The above code:

   test1               test2             
       a  b  c   d   e     a  b  c   d  e
1      1  5  2   8   2     0  0  0   8  2
2      2  4  4  20   2     1  1  1   1  1
3      3  3  1  20   2     0  0  0   8  2
4      4  2  2   1   0     0  0  2   1  0
5      5  1  4  -5  -4     5  1  4  -5 -4
6      1  5  2   2 -20     0  0  0   8  2
7      2  4  4   3   0     2  4  4   3  0
8      3  3  1  -1  -1     1  3  1  -1 -1
9      4  2  2   0   0     1  1  2   0  0
10     5  1  4  20  -2     2  2  2  20 -2
test1: 
     a  b  c   d   e
1   1  5  2   8   2
2   2  4  4  20   2
3   3  3  1  20   2
4   4  2  2   1   0
5   5  1  4  -5  -4
6   1  5  2   2 -20
7   2  4  4   3   0
8   3  3  1  -1  -1
9   4  2  2   0   0
10  5  1  4  20  -2
test2: 
     a  b  c   d  e
1   0  0  0   8  2
2   1  1  1   1  1
3   0  0  0   8  2
4   0  0  2   1  0
5   5  1  4  -5 -4
6   0  0  0   8  2
7   2  4  4   3  0
8   1  3  1  -1 -1
9   1  1  2   0  0
10  2  2  2  20 -2

      

+1


source







All Articles