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

如何将Pandas DataFrame转换为频次/布尔矩阵用于协同过滤?

嘿,刚接触Python几天就上手协同过滤项目,挺棒的!别慌,把你手里的DataFrame转换成目标频次矩阵其实用Pandas的几个简单工具就能搞定,我给你一步步拆解:

1. 先确认你的原始数据结构

假设你已经把CSV文件读成了一个名为df的DataFrame,结构大概是这样:

import pandas as pd

# 模拟你的原始数据
df = pd.DataFrame({
    'AlbumId': ['A1', 'A1', 'A2', 'A2', 'A2', 'A3', 'A3', 'A4', 'A4'],
    'ArtistId': ['R1', 'R2', 'R2', 'R4', 'R3', 'R3', 'R2', 'R4', 'R1']
})

2. 方法一:用pivot_table生成频次矩阵

这是最灵活的方法,适合需要自定义聚合逻辑的场景(这里我们只需要统计每个专辑-艺人组合的出现次数):

# 生成频次矩阵,缺失值用0填充
frequency_matrix = df.pivot_table(
    index='AlbumId',    # 行:专辑ID
    columns='ArtistId', # 列:艺人ID
    aggfunc='size',     # 统计每个组合的数量
    fill_value=0        # 没有关联的组合填0
)

print(frequency_matrix)

运行后你会得到完全符合预期的结果:

ArtistId  R1  R2  R3  R4
AlbumId                 
A1        1   1   0   0
A2        0   1   1   1
A3        0   1   1   0
A4        1   0   0   1

3. 方法二:用pd.crosstab快速生成交叉表

如果只是单纯统计频次,crosstab更直接,它专门用来做这类行列交叉的统计:

frequency_matrix = pd.crosstab(
    df['AlbumId'], 
    df['ArtistId'], 
    dropna=False  # 确保所有艺人ID都被保留,缺失项填0
)

这个方法的输出和上面完全一致,代码更简洁。

4. 转成布尔矩阵(可选)

如果你需要的是布尔值(True/False)而不是数值1/0,只需要对结果做个类型转换:

boolean_matrix = frequency_matrix.astype(bool)

5. 后续余弦相似度计算

拿到这个矩阵后,就可以用sklearn计算专辑之间的余弦相似度了:

from sklearn.metrics.pairwise import cosine_similarity

# 计算专辑间的余弦相似度
album_similarity = cosine_similarity(frequency_matrix)

# 转换成DataFrame,方便查看相似度结果
similarity_df = pd.DataFrame(
    album_similarity,
    index=frequency_matrix.index,
    columns=frequency_matrix.index
)

print(similarity_df)

要是还有啥细节没搞懂,尽管问,刚学Python的时候遇到这类数据转换问题很正常,慢慢来就好~

内容的提问来源于stack exchange,提问作者Nedunuri Rajesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:52