You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:04:20