如何用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_id | a |
|---|---|
| A | 5 |
| B | 3 |
如果需要强制包含指定的音乐列(比如示例中的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_id | a | b |
|---|---|---|
| A | 5 | NaN |
| B | 3 | NaN |
方法二:使用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
相关产品推荐
相关产品推荐

