2017-01-02 19 views
4

私はネット上で長い時間探していますが、役に立たないです。Python3でdataframeをdictに変換する方法

userId movieId rating timestamp 
1  31  2.5  1260759144 
1  1029 3.0  1260759179 
1  1061 3.0  1260759182 
1  1129 2.0  1260759185 
1  1172 4.0  1260759205 
2  31  3.0  1260759134 
2  1111 4.5  1260759256 

私が変換したい:私はこのようなテーブルを取得、私はMovieLensに

ratings = pd.read_table('ml-latest-small/ratings.csv') 

をcsvファイルを読むためにパンダを使用して、この

を達成するためにどのように役立つか、いくつかのアイデアを与えることをしてみてくださいそれは

{userId:{movieId:rating}} 

例えば

01のようなのdictします
{ 
1:{31:2.5,1029:3.0,1061,3.0,1129:2.0,1172:4.0}, 
2:{31:3.0,1111:4.5} 
} 

私はこのコードを試みたが、失敗しました:

for user in ratings['userId']: 
for movieid in ratings['movieId']: 
    di_rating.setdefault(user,{}) 
    di_rating[user][movieid]=ratings['rating'][ratings['userId'] == user][ratings['movieId'] == movieid] 

誰かが私を助けてくださいことはできますか?

答えて

4

あなたはiterrowsgroupbyを使用することができます。

d = df.groupby('userId').apply(lambda y: {int(x.movieId): x.rating for i, x in y.iterrows()}) 
     .to_dict() 
print (d) 
{ 
1: {1129: 2.0, 1061: 3.0, 1172: 4.0, 1029: 3.0, 31: 2.5}, 
2: {1111: 4.5, 31: 3.0} 
} 

削除答えから別の解決策:

d1 = df.groupby('userId').apply(lambda x: dict(zip(x['movieId'], x['rating']))).to_dict() 
print (d1) 
{ 
1: {1129: 2.0, 1061: 3.0, 1172: 4.0, 1029: 3.0, 31: 2.5}, 
2: {1111: 4.5, 31: 3.0} 
} 
+0

おかげでたくさん!しかし、 'movieId'は浮動小数点型に変換されているようです – Alfred

+0

あなたは 'int' - ' d = df.groupby( 'userId')にキャストすることができます。apply(lambda y:{int(x.movi​​eId):x.rating for i 、x in y.iterrows()})。to_dict() ' – jezrael

関連する問題