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

如何用Pandas或Numpy将用户音乐评分DataFrame转为稀疏矩阵?

将用户-音乐评分DataFrame转换为稀疏矩阵的实现方法

方法一:使用Pandas pivot() 快速转换

这是最直接的方式,适合已有数据的宽表转换:

首先构造示例数据:

import pandas as pd

df = pd.DataFrame({
    'user_id': ['A', 'B'],
    'music_id': ['a', 'a'],
    'rating': [5, 3]
})

执行转换:

# 行=user_id,列=music_id,值=rating
sparse_matrix = df.pivot(index='user_id', columns='music_id', values='rating')

转换后输出结果:

user_ida
A5
B3

如果需要强制包含指定的音乐列(比如示例中的b),可以结合reindex扩展列:

# 指定所有需要的音乐ID
all_music = ['a', 'b']
sparse_matrix = df.pivot(index='user_id', columns='music_id', values='rating').reindex(columns=all_music)

此时结果会包含b列,缺失值显示为NaN:

user_idab
A5NaN
B3NaN

方法二:使用Pandas pivot_table()(支持重复条目)

如果存在同一用户对同一音乐的多条评分,可以用pivot_table聚合(比如取均值),用法和pivot类似:

sparse_matrix = df.pivot_table(index='user_id', columns='music_id', values='rating', aggfunc='mean')

方法三:结合Scipy构建稀疏矩阵(大数据场景)

如果数据量极大,用密集矩阵会浪费内存,可以用Scipy的稀疏矩阵格式存储:

from scipy.sparse import csr_matrix

# 映射用户和音乐到数字索引
user_idx = {u: i for i, u in enumerate(df['user_id'].unique())}
music_idx = {m: i for i, m in enumerate(['a', 'b'])}

# 提取行、列、值的数组
rows = df['user_id'].map(user_idx).values
cols = df['music_id'].map(music_idx).values
vals = df['rating'].values

# 构建CSR稀疏矩阵
sparse_mat = csr_matrix((vals, (rows, cols)), shape=(len(user_idx), len(music_idx)))

# 可选:转成Pandas DataFrame查看
sparse_df = pd.DataFrame.sparse.from_spmatrix(sparse_mat, index=user_idx.keys(), columns=music_idx.keys())

这种方式内存占用远低于密集矩阵,适合大规模数据集。


内容的提问来源于stack exchange,提问作者DS Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:15:40