有没有办法用纯粹的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',...})
正如我所说,我不介意重新排序最初的字典,但我希望整个事情尽可能干净。
答案 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]: