2015-11-09 3 views
2

Мой словарь выглядит следующим образом:Панды dataframe из вложенного словаря

{'x': {'b': 10, 'c': 20}, 'y': {'b': '33', 'c': 44}} 

Я хочу, чтобы получить dataframe, который выглядит следующим образом:

index col1 col2 val 
0  x  b  10 
1  x  c  20 
2  y  b  33 
3  y  c  44 

Я пытался дозвониться pandas.from_dict(), но не дал мне желаемого результата. Итак, что является самым элегантным, практичным способом достижения этого?

EDIT: В действительности, мой словарь имеет глубину 4, поэтому я хотел бы увидеть решение для этого случая или, в идеале, тот, который будет работать на произвольной глубине в общей настройке.

Вот пример более глубокого словаря: {'x':{'a':{'m':1, 'n':2}, 'b':{'m':10, 'n':20}}, 'y':{'a':{'m':100, 'n':200}, 'b':{'m':111, 'n':222}} } Соответствующий dataframe должен иметь 8 строк.

ОТВЕТ:

df = pd.DataFrame([(k1, k2, k3, k4, k5, v) for k1, k2345v in dict.items() 
          for k2, k345v in k2345v.items() 
          for k3, k45v in k345v.items() 
          for k4, k5v in k45v.items() 
          for k5, v in k5v.items()]) 

ответ

2

Вы можете использовать понимание списка, чтобы переупорядочить свой dict в список кортежей, где каждый кортеж является строкой, и затем вы можете сортировать свою фреймворк данных

import pandas as pd 

d = {'x': {'b': 10, 'c': 20}, 'y': {'b': '33', 'c': 44}} 

df = pd.DataFrame([(k,k1,v1) for k,v in d.items() for k1,v1 in v.items()], columns = ['Col1','Col2','Val']) 
print df.sort(['Col1','Col2','Val'], ascending=[1,1,1]) 

    Col1 Col2 Val 
3 x b 10 
2 x c 20 
1 y b 33 
0 y c 44 
+1

Можете ли вы изменить это для работы со словарем произвольной глубины? В моем случае у меня есть глубина 4, но в идеале я бы хотел увидеть общие решения. Спасибо –

+0

@BaronYugovich Можете ли вы добавить более подробный пример – SirParselot

+0

Я принимаю этот ответ, потому что мне удалось его обобщить, обобщение добавлено в мой первоначальный вопрос. –

1

сначала создать ФР, используя from_dict, а затем вызвать stack и reset_index, чтобы получить форму вы хотите, то вы должны переименовать COLS, сортировать и сбросить индекс:

In [83]: 
d={'x': {'b': 10, 'c': 20}, 'y': {'b': '33', 'c': 44}} 
df = pd.DataFrame.from_dict(d, orient='index').stack().reset_index() 
df.columns = ['col1', 'col2', 'val'] 
df.sort_values(['col1', 'col2'], inplace=True) 
df.reset_index(drop=True, inplace=True) 
df 

Out[83]: 
    col1 col2 val 
0 x b 10 
1 x c 20 
2 y b 33 
3 y c 44 
+0

Будет ли это работать для более глубоко вложенных словарей? –

+0

Зависит, но я бы сказал, что нет, поскольку ctor делает презумпции о структуре, поэтому вам может понадобиться развернуть dict dict – EdChum

+0

Не могли бы вы отредактировать свой ответ, а затем объяснить это? Мой словарь имеет глубину 4, т. Е. (Key1, key2, key3, key4, val), вы получаете идею. –

Смежные вопросы