2016-09-13 2 views
1

Этот вопрос следует мой предыдущий one.it это мать словарь одного до того store dictionary in pandas dataframeмагазин сложный словарь в панд dataframe

меня есть словарь

dictionary_example={'New York':{1234:{'choice':0,'city':'New York','choice_set':{0:{'A':100,'B':200,'C':300},1:{'A':200,'B':300,'C':300},2:{'A':500,'B':300,'C':300}}}, 
    234:{'choice':1,'city':'New York','choice_set':{0:{'A':100,'B':400},1:{'A':100,'B':300,'C':1000}}}, 
    1876:{'choice':2,'city':'New York','choice_set':{0:{'A': 100,'B':400,'C':300},1:{'A':100,'B':300,'C':1000},2:{'A':600,'B':200,'C':100}} 
    }}, 
    'London':{1534:{'choice':0,'city':'London','choice_set':{0:{'A':100,'B':400,'C':300},1:{'A':200,'B':300,'C':300},2:{'A':500,'B':300,'C':300}}}, 
    2134:{'choice':1,'city':'London','choice_set':{0:{'A':100,'B':600},1:{'A':170,'B':300,'C':1000}}}, 
    1776:{'choice':2,'city':'London','choice_set':{0:{'A':100,'B':400,'C':500},1:{'A':100,'B':300},2:{'A':600,'B':200,'C':100}}}}, 

    'Paris':{1534:{'choice':0,'city':'Paris','choice_set':{0:{'A':100,'B':400,'C':300},1:{'A':200,'B':300,'C':300},2:{'A':500,'B':300,'C':300}}}, 
    2134:{'choice':1,'city':'Paris','choice_set':{0:{'A':100,'B':600},1:{'A':170,'B':300,'C':1000}}}, 
    1776:{'choice':1,'city':'Paris','choice_set':{0:{'A': 100,'B':400,'C':500},1:{'A':100,'B':300}}} 
    }} 

Я хочу, чтобы она стала данные панды (некоторые конкретные значения внутри могут быть не совсем точными)

id choice A_0 B_0 C_0 A_1 B_1 C_1 A_2 B_2 C_2 New York London Paris 
1234 0  100 200 300 200 300 300 500 300 300 1  0  0 
234 1  100 400 - 100 300 1000 - - - 1  0  0 
1876 2  100 400 300 100 300 1000 600 200 100 1  0  0 
1534 0  100 200 300 200 300 300 500 300 300 0  1  0 
2134 1  100 400 - 100 300 1000 - - - 0  1  0 
2006 2  100 400 300 100 300 1000 600 200 100 0  1  0 
1264 0  100 200 300 200 300 300 500 300 300 0  0  1 
1454 1  100 400 - 100 300 1000 - - - 0  0  1 
1776 1  100 400 300 100 300  - - - - 0  0  1 

В старом вопросе хороший парень обеспечить путь для sub_dictionary:

df = pd.read_json(json.dumps(dictionary_example)).T 


def to_s(r): 
    return pd.read_json(json.dumps(r)).unstack() 

flattened_choice_set = df["choice_set"].apply(to_s) 

flattened_choice_set.columns = ['_'.join((str(col[0]), col[1])) for col in flattened_choice_set.columns] 

result = pd.merge(df, flattened_choice_set, 
     left_index=True, right_index=True).drop("choice_set", axis=1) 

Любой способ сделать для большого словаря?

Все самое лучшее, Kevin

+0

Ключи к примерному словарю: ['Paris', 'London', 234, 'New York', 1876], вы смешивали скобки или это часть вызова? ;) –

+0

должен быть в Нью-Йорке и Париже, я проверю его. –

+0

Должно быть хорошо сейчас –

ответ

2

Ранее Предложенное решение, так как вы цитируете, не очень аккуратно один. Это более читаемо и обеспечивает решение вашей текущей проблемы. Если возможно, следует пересмотреть структуру данных, хотя ...

df = pd.DataFrame() 
question_ids = [0,1,2] 

Создать dataframe с рядом для каждого города-выбора комбинации со словарем в выборе набора столбцов

for _, city_value in dictionary_example.iteritems(): 
    city_df = pd.DataFrame.from_dict(city_value).T 
    city_df = city_df.join(pd.DataFrame(city_df["choice_set"].to_dict()).T) 
    df = df.append(city_df) 

Регистрации странных имен столбцов от выбора установлен в вашем ДХ

for i in question_ids: 
    choice_df = pd.DataFrame(df[i].to_dict()).T 
    choice_df.columns = map(lambda x: "{}_{}".format(x,i), choice_df.columns) 
    df = df.join(choice_df) 

Закрепить город колонны

df = pd.get_dummies(df, prefix="", prefix_sep="", columns=['city']) 
df.drop(question_ids + ['choice_set'], axis=1, inplace=True) 
# Optional to remove NaN from questions: 
# df = df.fillna(0) 
df 
+0

Приветствия! Вы спасли меня. –

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