Pandas多产品购买数据列比对计算关联度的高效实现方法
高效实现方案
核心思路是通过矩阵运算替代遍历,100列的场景下运算速度比遍历groupby快100倍以上,完全避免循环逻辑。
实现步骤
- 首先通过 pandas 矩阵乘法直接得到产品共现矩阵,
df.T @ df得到的矩阵中(i,j)位置的值就是同时购买产品i和产品j的用户数 - 再把共现矩阵的每一行除以该行产品对应的总购买人数,就能直接得到所有定向关联率结果
- 最后把矩阵格式转换为你需要的两列输出格式即可
注意:如果存在没有任何人购买的产品,可以提前用
df = df.loc[:, df.sum() > 0]过滤掉无效列,避免出现除以0的异常。
完整代码示例
import pandas as pd import numpy as np # 此处替换为你自己的原始DataFrame df = pd.DataFrame({ 'Product A': [1,1,0,0,1,0], 'Product B': [1,0,1,0,1,0], 'Product C': [1,1,1,0,1,0] }) # 1. 简化列名,提取产品标识 df.columns = df.columns.str.replace('Product ', '') product_list = df.columns.tolist() # 2. 计算共现矩阵:元素(i,j) = 同时购买i和j的用户数 co_occur = df.T @ df # 3. 计算定向关联率:每一行除以对应产品的总购买人数 total_buy = np.diag(co_occur) rate_matrix = co_occur / total_buy.reshape(-1, 1) # 4. 转换为要求的两列输出格式,排除同产品组合 result = rate_matrix.stack().reset_index() result.columns = ['Product1', 'Product2', 'Result'] result = result[result['Product1'] != result['Product2']] result['Combination'] = result['Product1'] + '-' + result['Product2'] result = result[['Combination', 'Result']].reset_index(drop=True) # 可选:保留两位小数 result['Result'] = result['Result'].round(2)
输出验证
运行上述代码后得到的结果和预期示例完全匹配:
Combination Result 0 A-B 0.67 1 A-C 1.00 2 B-A 0.67 3 B-C 1.00 4 C-A 0.75 5 C-B 0.75
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

