2017-07-04 5 views
1

Ich weiß, wie man einen Datenrahmen in ein Wörterbuch umwandelt, aber ich bin nicht sicher, wie ich ein Wörterbuch mit einem willkürlichen hinzugefügten Schlüsselnamen schaffen kann.Umwandlung Pandas Dataframe in ein Wörterbuch mit einem neuen Schlüsselname

Sagen wir, ich habe einen Datenrahmen wie folgt.

raw_data = {'regiment': ['Nighthawks', 'Nighthawks', 'Nighthawks', 'Nighthawks', 'Dragoons', 'Dragoons', 'Dragoons', 'Dragoons', 'Scouts', 'Scouts', 'Scouts', 'Scouts'], 
'company': ['1st', '1st', '2nd', '2nd', '1st', '1st', '2nd', '2nd','1st', '1st', '2nd', '2nd'], 
'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
'preTestScore': [4, 24, 31, 2, 3, 4, 24, 31, 2, 3, 2, 3], 
'postTestScore': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]} 

df = pd.DataFrame(raw_data, columns = ['regiment', 'company', 'name', 'preTestScore', 'postTestScore']) 

df.head() 
Out[96]: 
    regiment company  name preTestScore postTestScore 
0 Nighthawks  1st Miller    4    25 
1 Nighthawks  1st Jacobson   24    94 
2 Nighthawks  2nd  Ali   31    57 
3 Nighthawks  2nd Milner    2    62 
4 Dragoons  1st  Cooze    3    70 

Ich will ‚name‘ GROUPBY und maximal berechnen in ‚preTestScore‘ und schließlich ein Wörterbuch erstellen, wie folgend.

{'Miller': {'maxTestScore': 4}, 
'Jacobson': {'maxTestScore': 24}, ...} 

Hier habe ich einen neuen Schlüsselname 'maxTestScore' hinzugefügt. Wie kann ich das mit jedem beliebigen Schlüsselnamen erreichen? Vielen Dank im Voraus.

Antwort

2

Sie können dict comprehension mit groupby verwenden:

d = {k:{'maxTestScore':v.max()} for k,v in df.groupby('name')['preTestScore']} 
print (d) 

{'Piger': {'maxTestScore': 3}, 
'Milner': {'maxTestScore': 2}, 
'Sone': {'maxTestScore': 31}, 
'Jacon': {'maxTestScore': 4}, 
'Cooze': {'maxTestScore': 3}, 
'Sloan': {'maxTestScore': 2}, 
'Riani': {'maxTestScore': 2}, 
'Miller': {'maxTestScore': 4}, 
'Ali':  {'maxTestScore': 31}, 
'Ryaner': {'maxTestScore': 24}, 
'Jacobson':{'maxTestScore': 24}} 

Eine andere Lösung:

d = {k:{'maxTestScore':v} for k,v in df.groupby('name')['preTestScore'].max().iteritems()} 
print (d) 

{'Piger': {'maxTestScore': 3}, 
'Milner': {'maxTestScore': 2}, 
'Sone': {'maxTestScore': 31}, 
'Jacon': {'maxTestScore': 4}, 
'Cooze': {'maxTestScore': 3}, 
'Sloan': {'maxTestScore': 2}, 
'Riani': {'maxTestScore': 2}, 
'Miller': {'maxTestScore': 4}, 
'Ali':  {'maxTestScore': 31}, 
'Ryaner': {'maxTestScore': 24}, 
'Jacobson':{'maxTestScore': 24}} 
+0

Dank. das ist einfach und funktioniert. Ich wählte die zweite Lösung wegen ihrer kürzeren Länge und Klarheit. – user4279562

+0

Und Sie sind richtig, zweitens ist schöner, also tausche ich Lösungen. – jezrael

Verwandte Themen