如何将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
相关产品推荐
相关产品推荐

