Python 如何创建具有多级列的数据帧?

Python 如何创建具有多级列的数据帧?,python,pandas,multi-level,Python,Pandas,Multi Level,现有的一个问题涉及一个非常“常规”的数据框架,其中所有列和行都是产品,所有数据都存在 唉,我的情况不同了。我有这样的数据: [{street”:“Euclid”,“house”:42,“area”:123,(1,“卧室”):1,(1,“浴室”):4}, {“街道”:“欧几里德”,“房子”:19,“面积”:234,(2,“卧室”):3,(2,“浴室”):3}, {“街道”:“黎曼”,“房子”:42,“面积”:345,(1,“卧室”):5, (1,“浴室”):2,(2,“卧室”):12,(2,“浴室

现有的一个问题涉及一个非常“常规”的数据框架,其中所有列和行都是产品,所有数据都存在

唉,我的情况不同了。我有这样的数据:

<代码>[{street”:“Euclid”,“house”:42,“area”:123,(1,“卧室”):1,(1,“浴室”):4}, {“街道”:“欧几里德”,“房子”:19,“面积”:234,(2,“卧室”):3,(2,“浴室”):3}, {“街道”:“黎曼”,“房子”:42,“面积”:345,(1,“卧室”):5, (1,“浴室”):2,(2,“卧室”):12,(2,“浴室”):17}, {“街”:“里曼”,“房子”:19,“面积”:456,(1,“卧室”):7,(1,“浴室”):1}] 我想要这种
DataFrame
,行和列都有多级索引:

              area          1                  2
street house        bedrooms bathrooms bedrooms bathrooms
Euclid  42    123     1         4
Euclid  19    234                         3         3
Riemann 42    345     5         2        12        17
Riemann 19    456     7         1
因此,行索引应该是

MultiIndex([(“欧几里德”,42),(“欧几里德,19),(“黎曼,42),(“黎曼,19)],
名称=[“街道”、“房屋”])
列索引应该是

MultiIndex([(“面积”,无),(1,“卧室”),(1,“浴室”),(2,“卧室”),(2,“浴室”)],
名称=[“楼层”、“实体”])

我认为没有办法从我拥有的字典列表中生成这些索引。

我觉得应该有比这更好的东西;希望有人能做得更好:

创建一个函数来处理字典中的每个条目:

def process(entry):
    #read in data and get the keys to be the column names
    m = pd.DataFrame.from_dict(entry,orient='index').T
    #set index
    m = m.set_index(['street','house'])
    #create multi-index columns
    col1 = [ent[0] if isinstance(ent,tuple) else ent for ent in m.columns ]
    col2 = [ent[-1] if isinstance(ent,tuple) else None for ent in m.columns ]
    #assign multi-index column to m
    m.columns=[col1,col2]
    return m
将上述函数应用于数据(我将字典包装到数据变量中):

连接以获得最终输出

pd.concat(res)

                area               1                  2
                NaN    bedrooms bathrooms   bedrooms    bathrooms
street  house                   
Euclid    42    123     1        4           NaN         NaN
          19    234     NaN      NaN         3           3
Riemann   42    345     5        2           12          17
          19    456     7        1           NaN         NaN
pd.concat(res)

                area               1                  2
                NaN    bedrooms bathrooms   bedrooms    bathrooms
street  house                   
Euclid    42    123     1        4           NaN         NaN
          19    234     NaN      NaN         3           3
Riemann   42    345     5        2           12          17
          19    456     7        1           NaN         NaN