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

如何用Pandas分析少量商品的商品间相关性?

解决商品相关性分析的NaN问题(附完整实操步骤)

嘿,刚看到你的问题,作为经常折腾这类商品关联分析的人,我来给你捋捋为什么会出NaN,以及怎么快速解决~

首先,你用corrwith()得到NaN的核心原因是数据结构完全不对——corrwith()是用来对比两个结构匹配的DataFrame列之间的相关性,但你现在的DataFrame2是用户和商品的关联列表,根本不是适合计算商品间相关性的矩阵格式。咱们得先把数据转换成「用户-商品共现矩阵」,再谈相关性计算。

步骤1:生成用户-商品共现矩阵

你的DataFrame2是长格式(每行是一条用户-商品关联记录),我们需要把它转成宽格式:每行代表一个用户,每列代表一个商品,单元格值为1(用户关联过该商品)或0(没关联过)。如果同一个用户多次关联同一商品,我们只需要标记为1就行(毕竟关联次数不影响「是否关联」的相关性逻辑)。

用pandas.crosstab()就能快速实现:

import pandas as pd

# 假设你的用户-商品关联表叫df_user_item
# 生成初始共现矩阵:行=userId,列=itemID,值为该用户关联该商品的次数
user_item_matrix = pd.crosstab(df_user_item['userId'], df_user_item['itemID'])
# 把次数转成0/1(不管关联几次,只要关联过就记为1)
user_item_matrix = user_item_matrix.clip(upper=1)

步骤2:计算商品间的相关性

现在有了共现矩阵,直接用corr()方法就能计算列与列之间的相关系数(也就是商品和商品之间的相关性):

# 默认用皮尔逊相关系数,也可以指定method='spearman'或'kendall'
item_correlation = user_item_matrix.corr()

这时候你会得到一个7×7的矩阵,每个单元格item_correlation.loc[item1, item3]就是商品1和商品3的相关系数,越接近1说明两者的用户关联重叠度越高(也就是相关性越强)。

为啥之前用corrwith()会得到NaN?

corrwith()的设计逻辑是:让一个DataFrame的每一列,和另一个DataFrame的对应列计算相关性——比如两个列名、行数完全一致的DF才能算出有效结果。而你之前的两个DF一个是商品基础信息,一个是用户-商品关联记录,既没有匹配的列,也没有可计算的数值对,自然全是NaN啦。

额外小技巧:快速筛选高关联商品

如果想直接找出每个商品的高相关伙伴,可以用布尔索引快速筛选:

# 找出和商品1相关性大于0.7的商品(阈值你可以根据业务调整)
high_corr_items = item_correlation[item_correlation[1] > 0.7].index.tolist()
# 排除商品自己
high_corr_items.remove(1)
print(f"和商品1高度相关的商品:{high_corr_items}")

这样就能轻松得到你想要的商品关联结果啦!

内容的提问来源于stack exchange,提问作者Avinash Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:31