2014-11-24 3 views
0

У меня есть вложенный словарь, который имеет 5 уровней masterdict = {a : {b: {c: {d : { e: }}}}}, и я пытаюсь создать плоский фрейм данных.Как создать кадр данных из глубоко вложенного словаря?

Когда я запускаю следующий код:

masterDF = pd.DataFrame() 

for a in masterdict: 
    for b in masterdict[a]: 
     for c in masterdict[a][b]: 
     for d in masterdict[a][b][c]: 
      eDF = pd.DataFrame(masterdict[a][b][c][d]) 
      eDF['level4'] = str(d) 
      eDF['level3'] = str(c) 
      eDF['level2'] = str(b) 
      eDF['level1'] = str(a) 
      masterDF = masterDF.append(eDF) 

Я получаю следующее сообщение об ошибке:

--------------------------------------------------------------------------- 
PandasError        Traceback (most recent call last) 
<ipython-input-13-cc9930935c64> in <module>() 
     5  for c in masterdict[a][b]: 
     6   for d in masterdict[a][b][c]: 
----> 7    eDF = pd.DataFrame(masterdict[a][b][c][d]) 
     8    eDF['level4'] = str(d) 
     9    eDF['level3'] = str(c) 

C:\Anaconda\lib\site-packages\pandas\core\frame.pyc in __init__(self, data, index, columns, dtype, copy) 
    275           copy=False) 
    276    else: 
--> 277     raise PandasError('DataFrame constructor not properly called!') 
    278 
    279   NDFrame.__init__(self, mgr, fastpath=True) 

PandasError: DataFrame constructor not properly called! 

Я не уверен, если это правильный код для выравнивания вложенную словаря, но если это , не могли бы вы предложить, что я могу делать неправильно?

спасибо.

+1

Можете ли вы предоставить нам макет? Я подозреваю, что это json-файл? – biobirdman

ответ

0

Я пишу это, чтобы сгладить вложенные словари. Могу вам помочь. pk становится строкой предыдущего ключа, а текущий ключ - с ', чтобы присоединиться к ним. a становится списком элементов.

a=[] 
heading=[] 
def flat_dict(dic,pk=None): 
    for k,v in dic.items(): 
     if isinstance(v, dict): 
      try: 
       flat_dict(v,pk+"'"+k) 
      except: 
       flat_dict(v,k) 
     else: 
      a.append(v) 
     try: 
      heading.append(pk+"'"+k) 
      # print pk+'\''+k,v 
     except: 
      heading.append(k) 
      # print k,v 
Смежные вопросы