如何在Python3中将数据框转换为字典

4

我在网上搜索了很长时间,但没有结果。请帮忙或提供一些想法如何实现这个目标。

我使用 Pandas 读取 MovieLens 的 csv 文件。

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

然后我得到了这样一张表:
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

我希望将它转换成类似字典的形式。
{userId:{movieId:rating}}

e.g

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

有人可以帮我吗?

1个回答

4
您可以使用 groupbyiterrows 进行操作:
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}
}

非常感谢!但是似乎'movieId'被转换为浮点类型。 - Alfred
你可以将其转换为 int - d = df.groupby('userId').apply(lambda y: { int(x.movieId): x.rating for i, x in y.iterrows()}).to_dict() - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接