在pandas中导入嵌套字典(来自yaml)

时间:2018-03-19 14:55:52

标签: pandas yaml

有几个这样的问题,但问题是我有一本字典词典...而不是字典列表

我正在导入一个像

这样的yaml文件
category1:
  region1:
    effect1:
       up: 10
       down: 20
    effect2:
       up: 30
       down: 50
    ...
  region2:
    effect1:
     up: 30
     down: 40
  ...
  region3:
  ...
category2:
  region1:
  ...

使用yaml.load导入时,我会得到一个像

这样的大字典
{'category':
     {'region1':
          {'effect1':
               {'up': 10, 'down': 20},
           ...

我可以在大熊猫中导入吗?我想要一张带有多索引的平台:

                                 up  down 
category1   region1    effect1   10    20
category1   region1    effect2   30    50
...
category1   region2    effect1   30    40
...

我想要一个通用解决方案,因为例如我有一些数据缺少region图层。

1 个答案:

答案 0 :(得分:4)

如果您有一个dict来生成数据帧,请使用json_normalize,然后拆分并展开列,即

di = {'category1': {'region1': {'effect1': {'up': 10, 'down': 20},'effect2': {'up': 12, 'down': 22}}},
  'category2':{'region2': {'effect1': {'up': 10, 'down': 20},'effect2': {'up': 12, 'down': 22}}}}

k = pd.io.json.json_normalize(di)

    #category1.region1.effect1.down  category1.region1.effect1.up  category1.region1.effect2.down  category1.region1.effect2.up ...
#0                              20                            10                               22                            12 ... 

k.columns = k.columns.str.split('.', expand=True)
# Transpose and unstack the dataframe for getting the actual dataframe 
main_df = k.T.unstack()[0]

输出:

                           down  up
category1 region1 effect1    20  10
                  effect2    22  12
category2 region2 effect1    20  10
                  effect2    22  12

或等同物:

k = pd.io.json.json_normalize(di).T
k.index = k.index.str.split('.',expand=True)
mdf = k.unstack()[0]