Pandas如何统计同一购买订单中两两商品组合的出现次数
你已经完成了独热编码的预处理步骤,后续可以按以下逻辑处理得到目标结果:
- 首先按
purchase分组聚合,得到每个订单下各水果的出现标记
# 按订单ID分组求和,同一个订单中出现过的水果值为1,未出现为0 purchase_item = df2.groupby('purchase').sum()
- 利用矩阵乘法计算两两水果的共现次数
独热编码的转置矩阵与原矩阵相乘后,矩阵中第i行第j列的数值就是第i种水果和第j种水果共同出现的订单数:
# 计算共现矩阵 cooc_matrix = purchase_item.T.dot(purchase_item)
- 对共现矩阵做格式转换,得到最终长表结构
需要剔除自己与自己的配对、重复的配对(避免同时出现apple-banana和banana-apple),再转换为目标格式:
import numpy as np # 对角线值为水果自身的出现总次数,置为0剔除 np.fill_diagonal(cooc_matrix.values, 0) # 仅保留矩阵上三角部分,避免重复配对 upper_matrix = cooc_matrix.where(np.triu(np.ones(cooc_matrix.shape), k=1).astype(bool)) # 转换为长表,删除空值后重命名列 result = upper_matrix.stack().reset_index() result.columns = ['item_1', 'item_2', 'purchase'] # 可选:过滤共现次数为0的无效配对 result = result[result['purchase'] > 0].reset_index(drop=True)
如果你不想走独热编码的路线,也可以直接对每个订单的水果生成两两组合后统计次数,实现逻辑更直观:
from itertools import combinations import pandas as pd # 生成每个订单内的所有两两水果组合 order_combo = df.groupby('purchase')['item'].apply(lambda x: list(combinations(sorted(x), 2))) # 统计所有组合的出现次数 result = order_combo.explode().value_counts().reset_index() # 拆分组合列为两列,调整为目标格式 result[['item_1', 'item_2']] = pd.DataFrame(result['item'].tolist(), index=result.index) result = result[['item_1', 'item_2', 'count']].rename(columns={'count': 'purchase'})
内容的提问来源于stack exchange,提问作者user3276768
相关产品推荐
相关产品推荐

