将Pandas DataFrame转换为嵌套字典用于sparse matrix构建的问题
将Pandas DataFrame转换为嵌套字典(用于相似艺术家稀疏矩阵)
嘿,我帮你搞定这个问题!要把Pandas DataFrame转成你想要的{'user': {'artist': plays}}格式嵌套字典其实很简单,用Pandas自带的分组和字典转换方法就能轻松实现,甚至不需要自己手动处理嵌套列表~
先假设你的示例DataFrame结构
首先我先模拟一个符合你需求的样本数据,方便演示:
import pandas as pd # 示例数据:包含用户、艺术家、播放次数三列 df = pd.DataFrame({ 'user': ['user1', 'user1', 'user1', 'user2', 'user2'], 'artist': ['artist1', 'artist2', 'artist3', 'artist1', 'artist3'], 'plays': [5, 3, 2, 4, 1] })
方法一:分组后直接转换(最简洁)
这是最直接的实现方式,利用groupby分组后,对每组数据进行字典映射:
# 按user分组,每组内将artist映射为plays,最后转成外层字典 nested_dict = df.groupby('user').apply(lambda x: x.set_index('artist')['plays'].to_dict()).to_dict()
执行后得到的结果完全符合你的预期:
{'user1': {'artist1': 5, 'artist2': 3, 'artist3': 2}, 'user2': {'artist1': 4, 'artist3': 1}}
方法二:透视表转换(适合稀疏矩阵需求)
如果你后续要构建稀疏矩阵,可能需要保留所有艺术家的键(即使某个用户没有播放过,值设为0),那用透视表的方式更合适:
# 生成透视表,user为行,artist为列,plays为值,缺失值填充为0 pivot_df = df.pivot(index='user', columns='artist', values='plays').fillna(0) # 将透视表转换为嵌套字典 nested_dict = pivot_df.to_dict('index')
这种方式得到的结果会包含所有艺术家,未播放的艺术家值为0:
{'user1': {'artist1': 5.0, 'artist2': 3.0, 'artist3': 2.0}, 'user2': {'artist1': 4.0, 'artist2': 0.0, 'artist3': 1.0}}
为什么你之前的嵌套列表转换有问题?
如果之前你尝试分组后得到的是嵌套列表,那大概率是没在分组内完成artist到plays的映射。上面的两种方法都是直接在分组内部完成了键值对的转换,避免了手动处理列表的麻烦,效率也更高~
内容的提问来源于stack exchange,提问作者Mr. Jibz
相关产品推荐
相关产品推荐

