2016-09-12 4 views
3

I aa Wörterbuch zu einem Datenrahmenstore Wörterbuch in Pandas Datenrahmen

dictionary_example={1234:{'choice':0,'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,'choice_set':0:{'A':100,'B':400},1:{'A':100,'B':300,'C':1000}}, 
    1876:{'choice':2,'choice_set':0:{'A': 100,'B':400,'C':300},1:{'A':100,'B':300,'C':1000},2:{'A':600,'B':200,'C':100}} 
    } 

speichern wollen, die sie in

setzen
id choice 0_A 0_B 0_C 1_A 1_B 1_C 2_A 2_B 2_C 
1234 0  100 200 300 200 300 300 500 300 300 
234 1  100 400 - 100 300 1000 - - - 
1876 2  100 400 300 100 300 1000 600 200 100 

Antwort

3

Ich denke, die folgenden ziemlich nahe ist, ist der Kerngedanke einfach wandeln Sie diese Wörterbücher in json um und verlassen Sie sich auf pandas.read_json, um sie zu analysieren.

dictionary_example={ 
     "1234":{'choice':0,'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,'choice_set':{0:{'A':100,'B':400},1:{'A':100,'B':300,'C':1000}}}, 
     "1876":{'choice':2,'choice_set':{0:{'A': 100,'B':400,'C':300},1:{'A':100,'B':300,'C':1000},2:{'A':600,'B':200,'C':100}}} 

    } 

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) 

result 

enter image description here

+0

bearbeiten ich den Code mit einem zusätzlichen 'merge'step, ohne es da wir die "Wahl" Säule verloren. Ich stelle fest, dass der Multi-Index während des Prozesses in sein Tupel-Äquivalent abgeflacht wird. – Svend

+1

Sie benötigen 'flattened_choice_set.columns = ['_'. Join ((str (col [0]), col [1])) für col in flattened_choice_set.columns]' before 'merge'. – jezrael

+0

:) Ja, es ist eine andere Lösung – jezrael

Verwandte Themen