如何将嵌套字典转换为pandas数据帧?

时间:2016-11-16 17:29:51

标签: python pandas dataframe

我有一个字典“my_dict”,格式为:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<?php $number=0 ; ?>
<table>
  <tr id='number'>
    <td>
      <input type="text" style="width: 70px; text-align: right" name="IMLORD" id="IMLORD" class="decimal-2-places" aria-describedby="basic-addon1" placeholder=",00" maxlength="6">
    </td>
    <td>
      <input type="text" style="width: 70px;" name="DTMMAA" id="DTMMAA" class="dtmmaa" data-date-format="mm/yyyy" aria-describedby="basic-addon1" placeholder="MM/AAAA" maxlength="6">
    </td>


    <td>
      <div align="left">
        <button type="button" value="Aggiorna" onclick="Aggiorna('<?php echo $number; ?>')" class="btn btn-primary" style="float: left;" aria-label="Left Align">
          <span class="glyphicon glyphicon-send" style="color:yellow" aria-hidden="true"></span> Registra
        </button>
      </div>
    </td>

目前,我正在使用{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2}, 'c2': {'a': 3, 'b': 4, 'c': 5}}, 'l2':{'c1': {'a': 0, 'b': 1, 'c': 2}, 'c2': {'a': 3, 'b': 4, 'c': 5}} } 并获得这样的df:

pd.DataFrame.from_dict(my_dict, orient='index')

然而,我想要的是l1 / l2和c2 / c3作为索引而a / b / c作为列。
像这样:

                             c2                           c1
l1  {u'a': 3, u'c': 5, u'b': 4}  {u'a': 0, u'c': 2, u'b': 1}
l2  {u'a': 3, u'c': 5, u'b': 4}  {u'a': 0, u'c': 2, u'b': 1}

最好的方法是什么?

1 个答案:

答案 0 :(得分:5)

考虑使用字典理解来构建带有元组键的字典。然后,使用熊猫&#39; MultiIndex.from_tuplesast以下用于从字符串重建原始字典(忽略您最后的步骤)。

import pandas as pd
import ast

origDict = ast.literal_eval("""
{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2},
       'c2': {'a': 3, 'b': 4, 'c': 5}},
 'l2':{'c1': {'a': 0, 'b': 1, 'c': 2},
       'c2': {'a': 3, 'b': 4, 'c': 5}}
}""")

# DICTIONARY COMPREHENSION
newdict = {(k1, k2):v2 for k1,v1 in origDict.items() \
                       for k2,v2 in origDict[k1].items()}
print(newdict)
# {('l1', 'c2'): {'c': 5, 'a': 3, 'b': 4},
#  ('l2', 'c1'): {'c': 2, 'a': 0, 'b': 1},
#  ('l1', 'c1'): {'c': 2, 'a': 0, 'b': 1},
#  ('l2', 'c2'): {'c': 5, 'a': 3, 'b': 4}}

# DATA FRAME ASSIGNMENT
df = pd.DataFrame([newdict[i] for i in sorted(newdict)],
                  index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))    
print(df)
#        a  b  c
# l1 c1  0  1  2
#    c2  3  4  5
# l2 c1  0  1  2
#    c2  3  4  5