2017-02-02 11 views
3

Ich bin mit Python 3.6 und Pandas 0.19.2 und haben einen Datenrahmen, die wie folgt aussieht konvertieren:Wie Pandas Datenrahmen, um verschachtelte Wörterbuch

Name  Chain  Food  Healthy 

George McDonalds burger  False 
George KFC   chicken False 
John  Wendys  burger  False 
John  McDonalds salad  True 

ich diesen Datenrahmen in eine dict verwandeln wollen, die wie folgt aussieht :

health_data = {'George': {'McDonalds': {'Food': 'burger', 'Healthy':False}, 
          'KFC':  {'Food': 'chicken', 'Healthy':False}}, 
       'John': {'Wendys': {'Food': 'burger', 'Healthy':False}, 
          'McDonalds': {'Food': 'salad', 'Healthy': True}}} 

Meine Gedanken sind so weit:

  1. Verwenden df.groupby gruppieren die Namen Spalte
  2. Verwenden df.to_dict() die Datenrahmen in ein Wörterbuch nach dem Vorbild der zu transformieren: health_data = input_data.set_index('Chain').T.to_dict()

Gedanken? Danke im Voraus für die Hilfe.

Antwort

4

Ich glaube, Sie ganz in der Nähe war.

Verwenden groupby und to_dict:

df = df.groupby('Name')[['Chain','Food','Healthy']] 
     .apply(lambda x: x.set_index('Chain').to_dict(orient='index')) 
     .to_dict() 

print (df) 
{'George': {'KFC': {'Healthy': False, 'Food': 'chicken'}, 
      'McDonalds': {'Healthy': False, 'Food': 'burger'}}, 
'John': {'McDonalds': {'Healthy': True, 'Food': 'salad'}, 
     'Wendys': {'Healthy': False, 'Food': 'burger'}}} 
+0

Thanks so much! Das hat perfekt funktioniert. Eine kleine Frage: Was macht die "Kette", "Essen", "gesund"]] Teil der Antwort? – MRR

+0

Es sind Filterspalten, aber wenn keine anderen Spalten in 'df' vorhanden sind, kann es vereinfacht werden wie' df.groupby ('Name'). Apply (Lambda x: x.set_index ('Kette'). To_dict (orient = ' index ')). to_dict() ' – jezrael

4

Wörterbuch Verständnis + groupby

{n: grp.loc[n].to_dict('index') 
for n, grp in df.set_index(['Name', 'Chain']).groupby(level='Name')} 

{'George': {'KFC': {'Food': 'chicken', 'Healthy': False}, 
    'McDonalds': {'Food': 'burger', 'Healthy': False}}, 
'John': {'McDonalds': {'Food': 'salad', 'Healthy': True}, 
    'Wendys': {'Food': 'burger', 'Healthy': False}}} 

defaultdict

from collections import defaultdict 

d = defaultdict(dict) 

for i, row in df.iterrows(): 
    d[row.Name][row.Chain] = row.drop(['Name', 'Chain']).to_dict() 

dict(d) 

{'George': {'KFC': {'Food': 'chicken', 'Healthy': False}, 
    'McDonalds': {'Food': 'burger', 'Healthy': False}}, 
'John': {'McDonalds': {'Food': 'salad', 'Healthy': True}, 
    'Wendys': {'Food': 'burger', 'Healthy': False}}} 
Verwandte Themen