列表字典中的数据框

时间:2016-12-01 10:35:04

标签: python pandas dictionary

有没有办法用纯粹的pandas方法实现以下操作,或者首先重新排列字典本身更合理?

初始字典:

data_json = {'a':[{'aa':1,'bb':2,'cc':3},
                  {'aa':2,'bb':2,'cc':3},
                  {'aa':3,'bb':2,'cc':3}],
             'b':[{'beta':22,'alpha':23,'gamma':24},
                  {'gamma':24,'beta':25,'alpha':26},
                  {'alpha':34,'beta':35,'gamma':36}]}

我想获得一个数据框,其中列名将是嵌套字典键:

  aa bb cc alpha beta gamma
1  1  2  3    23   22    24
2  2  2  3    26   25    24
3  3  2  3    34   35    36

尝试:

aaa = pd.DataFrame(data_json)
foo = lambda x: pd.Series([i for i in x.items()])
bbb=pd.concat([aaa['a'].apply(foo),aaa['b'].apply(foo)],axis=1)

给我

   0  1  2     0    1     2
1  1  2  3    23   22    24
2  2  2  3    26   25    24
3  3  2  3    34   35    36

但现在我被卡住了,因为列名重复了[0,1,2,0,1,2]而我不能只使用

bbb.rename(columns={0:'a',1:'b',...})

正如我所说,我不介意重新排序最初的字典,但我希望整个事情尽可能干净。

2 个答案:

答案 0 :(得分:2)

我会分别加载'a'和'b'并加入它们(在索引上合并它们):

pd.DataFrame(data_json['a']).join(pd.DataFrame(data_json['b']))


   aa  bb  cc  alpha  beta  gamma
0   1   2   3     23    22     24
1   2   2   3     26    25     24
2   3   2   3     34    35     36

循环的另一种方法,如果你不知道你有多少data_json.keys(),那么使用pd.concat,因为它对列表更方便。请注意,我正在使用 sorted(data_json)所以我可以在a之前获得b

list_df = []
for k in sorted(data_json):
    list_df.append(pd.DataFrame(data_json[k]))
pd.concat(list_df, axis=1)

答案 1 :(得分:2)

我会使用concat。注意:

In [11]: pd.DataFrame(data_json['a'])
Out[11]: 
   aa  bb  cc
0   1   2   3
1   2   2   3
2   3   2   3

In [12]: pd.DataFrame(data_json['b'])
Out[12]: 
   alpha  beta  gamma
0     23    22     24
1     26    25     24
2     34    35     36

如此简单:

In [13]: pd.concat((pd.DataFrame(v) for v in data_json.values()), axis=1)
Out[13]: 
   alpha  beta  gamma  aa  bb  cc
0     23    22     24   1   2   3
1     26    25     24   2   2   3
2     34    35     36   3   2   3

In [14]: