2015-10-15 24 views
10

ein Wörterbuch der Wörterbücher der Form haben:erstellen Pandas Datenrahmen von Wörterbuch der Wörterbücher

{'user':{movie:rating} } 

Zum Beispiel

{Jill': {'Avenger: Age of Ultron': 7.0, 
          'Django Unchained': 6.5, 
          'Gone Girl': 9.0, 
          'Kill the Messenger': 8.0} 
'Toby': {'Avenger: Age of Ultron': 8.5, 
           'Django Unchained': 9.0, 
           'Zoolander': 2.0}} 

ich diesen dict von dicts in eine Pandas Datenrahmen konvertieren wollen mit Spalte 1 der Benutzername und die anderen Spalten die Filmbewertungen zB

user Gone_Girl Horrible_Bosses_2 Django_Unchained Zoolander etc. \ 

Howev Einige Benutzer haben die Filme nicht bewertet und daher sind diese Filme nicht in den Werten() für diesen Benutzerschlüssel enthalten(). Es wäre in diesen Fällen nett, den Eintrag nur mit NaN zu füllen.

Ab sofort iterieren ich über die Tasten, füllen Sie eine Liste, und dann diese Liste verwenden, um einen Datenrahmen zu erstellen:

data=[] 
for i,key in enumerate(movie_user_preferences.keys()): 
    try:    
     data.append((key 
        ,movie_user_preferences[key]['Gone Girl'] 
        ,movie_user_preferences[key]['Horrible Bosses 2'] 
        ,movie_user_preferences[key]['Django Unchained'] 
        ,movie_user_preferences[key]['Zoolander'] 
        ,movie_user_preferences[key]['Avenger: Age of Ultron'] 
        ,movie_user_preferences[key]['Kill the Messenger'])) 
    # if no entry, skip 
    except: 
     pass 
df=pd.DataFrame(data=data,columns=['user','Gone_Girl','Horrible_Bosses_2','Django_Unchained','Zoolander','Avenger_Age_of_Ultron','Kill_the_Messenger']) 

Aber das gibt mir nur einen Datenrahmen von Nutzern, die alle bewerteten Filmen in der Satz.

Mein Ziel ist es, an die Datenliste durch Iterieren über die Film-Etiketten (anstelle der Brute-Force-Ansatz oben) anfügen, und zweitens erstellen Sie einen Datenrahmen, der alle Benutzer enthält und Null-Werte in die Elemente, die tun habe keine Filmbewertungen.

Antwort

17

Sie können die dict von dict an den Datenrahmen Konstruktor übergeben:

In [11]: d = {'Jill': {'Django Unchained': 6.5, 'Gone Girl': 9.0, 'Kill the Messenger': 8.0, 'Avenger: Age of Ultron': 7.0}, 'Toby': {'Django Unchained': 9.0, 'Zoolander': 2.0, 'Avenger: Age of Ultron': 8.5}} 

In [12]: pd.DataFrame(d) 
Out[12]: 
         Jill Toby 
Avenger: Age of Ultron 7.0 8.5 
Django Unchained   6.5 9.0 
Gone Girl    9.0 NaN 
Kill the Messenger  8.0 NaN 
Zoolander    NaN 2.0 

Oder verwenden Sie die from_dict Methode:

In [13]: pd.DataFrame.from_dict(d) 
Out[13]: 
         Jill Toby 
Avenger: Age of Ultron 7.0 8.5 
Django Unchained   6.5 9.0 
Gone Girl    9.0 NaN 
Kill the Messenger  8.0 NaN 
Zoolander    NaN 2.0 

In [14]: pd.DataFrame.from_dict(d, orient='index') 
Out[14]: 
     Django Unchained Gone Girl Kill the Messenger Avenger: Age of Ultron Zoolander 
Jill    6.5   9     8      7.0  NaN 
Toby    9.0  NaN     NaN      8.5   2 
+0

Gibt es eine Möglichkeit, die Benutzernamen zu einer einzelnen Spalte anstelle eines Indexes zu machen? – Feynman27

+3

pd.DataFrame.from_dict (d, orient = 'index'). Reset_index() –

+0

Großartig. Vielen Dank! – Feynman27

0

Diese Brute-Force-Ansatz scheint auch zu arbeiten, aber über die iteriert Filmlabels wären meiner Meinung nach immer noch robuster.

data=[] 
for i,key in enumerate(movie_user_preferences.keys()): 
    try:    
     data.append((key 
        ,movie_user_preferences[key]['Gone Girl'] if 'Gone Girl' in movie_user_preferences[key] else 'NaN' 
        ,movie_user_preferences[key]['Horrible Bosses 2'] if 'Horrible Bosses 2' in movie_user_preferences[key] else 'NaN' 
        ,movie_user_preferences[key]['Django Unchained'] if 'Django Unchained' in movie_user_preferences[key] else 'NaN' 
        ,movie_user_preferences[key]['Zoolander'] if 'Zoolander' in movie_user_preferences[key] else 'NaN' 
        ,movie_user_preferences[key]['Avenger: Age of Ultron'] if 'Avenger: Age of Ultron' in movie_user_preferences[key] else 'NaN' 
        ,movie_user_preferences[key]['Kill the Messenger'] if 'Kill the Messenger' in movie_user_preferences[key] else 'NaN')) 

    # if no entry, skip 
    except: 
     pass 


user Gone_Girl Horrible_Bosses_2 Django_Unchained Zoolander \ 
0  Sam   6     3    7.5   7 
1  Max  10     6    7.0  10 
2 Robert  NaN     5    7.0   9 
3  Toby  NaN    NaN    9.0   2 
4 Julia  6.5    NaN    6.0  6.5 
5 William   7     4    8.0   4 
6  Jill   9    NaN    6.5  NaN 

Avenger_Age_of_Ultron Kill_the_Messenger 
0     10.0    5.5 
1     7.0     5 
2     8.0     9 
3     8.5    NaN 
4     10.0     6 
5     6.0    6.5 
6     7.0     8 
Verwandte Themen