source

pandas를 만듭니다.사전에서 데이터프레임

factcode 2023. 11. 5. 15:01
반응형

pandas를 만듭니다.사전에서 데이터프레임

다음과 같은 형태의 사전을 가지고 있습니다.

{'user':{movie:rating} }

예를들면,

{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}}

나는 이 dict를 사용자 이름 열 1과 다른 열 영화 등급 열이 있는 팬더 데이터 프레임으로 변환하고 싶습니다.

user  Gone_Girl  Horrible_Bosses_2  Django_Unchained  Zoolander etc. \

그러나 일부 사용자는 동영상의 등급을 매기지 않았으므로 이러한 동영상은 해당 사용자 키()의 값()에 포함되지 않습니다.이런 경우에는 그냥 NaN으로 엔트리를 채우는 것이 좋을 것 같습니다.

지금부터는 키를 반복하고 목록을 채운 다음 이 목록을 사용하여 데이터 프레임을 만듭니다.

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'])

하지만 이것은 세트의 모든 영화를 평가한 사용자의 데이터 프레임만 제공합니다.

제 목표는 (위에서 보여준 무차별 대입 방식이 아닌) 영화 레이블을 반복하여 데이터 목록에 추가하고, 둘째로 모든 사용자를 포함하고 영화 등급이 없는 요소에 null 값을 배치하는 데이터 프레임을 만드는 것입니다.

dict 명령을 DataFrame 생성자에게 전달할 수 있습니다.

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

또는 사용.from_dict방법:

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

이러한 단순한 접근 방식도 효과가 있는 것처럼 보이지만, 제 생각에는 영화 레이블을 반복하는 것이 여전히 더 강력할 것 같습니다.

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  

언급URL : https://stackoverflow.com/questions/33157522/create-pandas-dataframe-from-dictionary-of-dictionaries

반응형