【问题标题】:How to convert dictionary into multilevel dataframe?如何将字典转换为多级数据框?
【发布时间】:2017-08-26 21:10:26
【问题描述】:

给定:

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)

然后,当我尝试将此字典转换为多级数据框时遇到了麻烦。但我不知道如何指定多级,我希望“键”是第二级数据框的名称。这是所需的输出

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

【问题讨论】:

  • 你需要一本字典吗?
  • 此外,如果索引不是BA,会发生什么?
  • @WillemVanOnsem 是的,除非从列表中更容易做到这一点,否则我需要评估是否更改我的其余代码以适应这个.....\\索引是相同的。
  • 有什么理由不直接从数据框中执行此操作? pd.concat([A, B], keys=['test1', 'test2'], axis=1)
  • pd.concat(d_test.values(), keys=d_test.keys(), axis=1)

标签: python python-3.x pandas dictionary dataframe


【解决方案1】:

只是为了在这里得到答案 (已经在 cmets 中给出)这里(再次):

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

实现相同的另一种(根据实际情况)方法(上述 cmets 中给出的答案):

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) 

上面的代码输出:

   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

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2021-01-08
    • 2020-07-31
    • 2019-05-26
    • 2020-07-06
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多