2016-12-01 57 views
2

有沒有一種方法可以用純粹的熊貓方法來實現以下目標?或者實際上是更合理的重新排列字典本身?來自列表字典的數據框

初始字典:

​​

而且我想獲得一個數據幀,其中列名會被嵌套字典鍵:

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

你介意加入你期待請輸出數據幀? –

+0

當然,不知道如何正確格式化,雖然 – kakk11

+0

你的方式很好。所以基本上你不再關心'a'或'b',而是價值清單中的其他項目。 –

回答

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),所以我可以ab

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

謝謝,這很好。 – kakk11

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]: 
+0

感謝您提供更一般的解決方案。 – kakk11