将值为字典列表的字典转换为pandas DataFrame

时间:2018-02-27 08:46:09

标签: python pandas dataframe

我有一个Python字典,其中包含列表作为与键对应的值。现在每个列表包含另外两个字典,数据如下所示:

data = {'A': [{'Set1': {'Apple':1, 'Banana:2'}, 'Set2': {'Orange':1}],
        'B': [{'Set1': {'Apple':3, 'Banana:1', Carrot:2}, 'Set2': {}],
        'C': [{'Set1': {'Apple':1, 'Banana:2'}, 'Set2': {'Pineapple':5}]}

我想将此数据转换为pandas DataFrame,结果应如下所示:

        Set1                                            Set2
A       {'Apple':1, 'Banana:2'}                         {'Orange':1} 
B       {'Set1': {'Apple':3, 'Banana:1', Carrot:2}      {}
C       {'Apple':1, 'Banana:2'}                         {'Pineapple':5}

我怎样才能做到这一点?

P.S:我尝试了pd.DataFrame(data)pd.DataFrame.from_dict(data),但这没效果。

2 个答案:

答案 0 :(得分:2)

我认为你需要:

data = {'A': [{'Set1': {'Apple':1, 'Banana':2}, 'Set2': {'Orange':1}}],
        'B': [{'Set1': {'Apple':3, 'Banana':1, 'Carrot':2}, 'Set2': {}}],
        'C': [{'Set1': {'Apple':1, 'Banana':2}, 'Set2': {'Pineapple':5}}]}

df = (pd.concat({k: pd.DataFrame(v) for k, v in data.items()})
        .reset_index(level=1, drop=True))
print (df)
                                     Set1              Set2
A               {'Banana': 2, 'Apple': 1}     {'Orange': 1}
B  {'Carrot': 2, 'Banana': 1, 'Apple': 3}                {}
C               {'Banana': 2, 'Apple': 1}  {'Pineapple': 5}

答案 1 :(得分:0)

这是一个通过字典理解的解决方案:

data = {'A': [{'Set1': {'Apple':1, 'Banana':2}, 'Set2': {'Orange':1}}],
        'B': [{'Set1': {'Apple':3, 'Banana':1, 'Carrot':2}, 'Set2': {}}],
        'C': [{'Set1': {'Apple':1, 'Banana':2}, 'Set2': {'Pineapple':5}}]}

df = pd.DataFrame({i: [data[k][0][i] for k in data] for i in data['A'][0]},
                  index=data)

#                                      Set1              Set2
# A               {'Apple': 1, 'Banana': 2}     {'Orange': 1}
# B  {'Apple': 3, 'Banana': 1, 'Carrot': 2}                {}
# C               {'Apple': 1, 'Banana': 2}  {'Pineapple': 5}