如何将复杂的dict导入熊猫?

时间:2017-03-28 14:35:17

标签: python pandas dataframe

我从XML文件中提取了这些数据:

d = {
    'test1': {
        0: {'a': {'min': 1, 'mid': 12, 'max': 13},
            'b': {'min': 2, 'mid': 22, 'max': 23}},
        3: {'a': {'min': 3, 'mid': 32, 'max': 33},
            'b': {'min': 4, 'mid': 42, 'max': 43}},
        8: {'a': {'min': 5, 'mid': 52, 'max': 53},
            'b': {'min': 6, 'mid': 62, 'max': 63}},            
    },
    'test2': {
        0: {'a': {'min': 9, 'mid': 12, 'max': 13},
            'b': {'min': 8, 'mid': 22, 'max': 23}},
        3: {'a': {'min': 7, 'mid': 32, 'max': 33},
            'b': {'min': 6, 'mid': 42, 'max': 43}},
        8: {'a': {'min': 5, 'mid': 52, 'max': 53},
            'b': {'min': 4, 'mid': 62, 'max': 63}},           
    },
}

我将其导入:

ds = pd.DataFrame.from_dict(d)

我想命名我的列,然后开始浏览我的数据。

列是:['Tests', 'Id', 'Item']

例如,我希望获得所有测试,任何项目和任何ID的所有mid值。所以我天真地写道:

ds[:,:,:,'min'] 

但显然它不起作用。

此外,我担心数据帧不会像它应该表示的那样。怎么办才能做到这一点?

+-------+----+------+-----+-----+-----+
|       |    |      | min | mid | max |
+-------+----+------+-----+-----+-----+
| Tests | Id | Item |     |     |     |
+-------+----+------+-----+-----+-----+
|       | 0  |  a   |  1  | 12  | 13  |
|       |    |  b   |  2  | 22  | 23  |
+ test1 +----+------+-----+-----+-----+
|       | 1  |  a   |  3  | 32  | 33  |
|       |    |  b   |  4  | 42  | 43  |
+-------+----+------+-----+-----+-----+
|       | 0  |  a   |  9  | 12  | 13  |
|       |    |  b   |  8  | 22  | 23  |
+ test2 +----+------+-----+-----+-----+
|       | 1  |  a   |  7  | 32  | 33  |
|       |    |  b   |  6  | 42  | 43  |
+-------+----+------+-----+-----+-----+

1 个答案:

答案 0 :(得分:7)

您需要在阅读之后使用stack进行一些手动转换(可能很难在一个步骤中完成此操作,因为通常字典可以尽可能深地嵌套):

(pd.DataFrame.from_dict(d, orient="index")
   .stack().apply(pd.Series)
   .stack().apply(pd.Series)
   .rename_axis(("Tests", "Id", "Item")))

enter image description here