2016-12-22 57 views
4

我有一個3級的字典是這樣的:如何將3級詞典轉換爲所需的格式?

data={'2016-11-28': {'area1': {'am': -0.007, 'pm': 0.008}, 'area2': {'am': 0.0, 'pm': 0.0}, 'area3': {'am': -0.01, 'pm': -0.001}},'2016-11-29':{'area1': {'am': -0.007, 'pm': 0.008}, 'area2': {'am': 0.0, 'pm': 0.0}, 'area3': {'am': -0.01, 'pm': -0.001}}} 

我想將它轉換成數據幀,而我想:

tickers=data['2016-11-28'].keys() 
iterables=[tickers,['am','pm']] 
index=pd.MultiIndex.from_product(iterables, names=['ticker', 'time']) 
frame=pd.DataFrame(data,index=index) 

,但我得到了

   2016-11-28 2016-11-29 
ticker time       
area1 am   NaN   NaN 
     pm   NaN   NaN 
area3 am   NaN   NaN 
     pm   NaN   NaN 
area2 am   NaN   NaN 
     pm   NaN   NaN 

有在數據框中沒有值,只有列名和索引名。我的代碼有什麼問題?有人可以幫忙嗎?非常感謝!

+1

http://stackoverflow.com/questions/13575090/construct-pandas-dataframe-from-items-in-nested-dictionary – acushner

回答

2

這是我自己的解決方案:三重for循環,迫使字典,以符合對分級指數規則,是{'col1':{('row1_level0', 'row1_level1'):value}}

使用

pd.DataFrame({'col1':{('rowidx0_level0', 'rowidx0_level1'):5}}) 

         col1 
rowidx0_level0 rowidx0_level1  5 

這裏時將這個樣子是實現

d = {} 
for date, areas in data.items(): 
    d[date] = {} 
    for area, times in areas.items(): 
     for time, value in times.items(): 
      d[date][(area, time)] = value 

pd.DataFrame(d) 

      2016-11-28 2016-11-29 
area1 am  -0.007  -0.007 
     pm  0.008  0.008 
area2 am  0.000  0.000 
     pm  0.000  0.000 
area3 am  -0.010  -0.010 
     pm  -0.001  -0.001 

而這就是實際的字典d樣子:

{'2016-11-28': {('area1', 'am'): -0.007, 
    ('area1', 'pm'): 0.008, 
    ('area2', 'am'): 0.0, 
    ('area2', 'pm'): 0.0, 
    ('area3', 'am'): -0.01, 
    ('area3', 'pm'): -0.001}, 
'2016-11-29': {('area1', 'am'): -0.007, 
    ('area1', 'pm'): 0.008, 
    ('area2', 'am'): 0.0, 
    ('area2', 'pm'): 0.0, 
    ('area3', 'am'): -0.01, 
    ('area3', 'pm'): -0.001}} 

採用從@acushner鏈接到的答案。

dates = [] 
frames = [] 

for date, d in data.items(): 
    dates.append(date) 
    frames.append(pd.DataFrame.from_dict(d, orient='index').stack()) 

pd.concat(frames, keys=dates, axis=1) 

      2016-11-28 2016-11-29 
area1 pm  0.008  0.008 
     am  -0.007  -0.007 
area2 pm  0.000  0.000 
     am  0.000  0.000 
area3 pm  -0.001  -0.001 
     am  -0.010  -0.010 
+0

謝謝!有效! – Steven

相關問題