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

如何统计Pandas DataFrame中产品共现同一order_id的次数及构建关联结构?

优化方案与矩阵形式实现

一、字典结构的高效实现

原代码嵌套循环的时间复杂度较高,数据量大时性能会明显下降。可以借助pandas的去重、分组操作优化逻辑,减少冗余计算:

import pandas as pd

# 第一步:对每个order_id去重product_no,同一订单内同产品仅保留一次
df_unique = temp_df[['order_id', 'product_no']].drop_duplicates()

# 初始化结果字典,先统计每个产品的订单出现次数
product_counts = df_unique['product_no'].value_counts().to_dict()
res = {
    str(prod): {
        'count': count,
        'together': {}
    } for prod, count in product_counts.items()
}

# 按订单分组处理共现关系,每对产品仅计算一次后双向更新
for _, group in df_unique.groupby('order_id'):
    prods = group['product_no'].tolist()
    for i in range(len(prods)):
        prod_a = str(prods[i])
        for j in range(i+1, len(prods)):
            prod_b = str(prods[j])
            res[prod_a]['together'][prod_b] = res[prod_a]['together'].get(prod_b, 0) + 1
            res[prod_b]['together'][prod_a] = res[prod_b]['together'].get(prod_a, 0) + 1

# 对每个产品的共现字典按次数降序排序
for prod in res:
    res[prod]['together'] = dict(sorted(res[prod]['together'].items(), key=lambda x: x[1], reverse=True))

这个版本通过先去重减少了后续处理的数据量,并且仅处理每对产品一次(i<j)再双向更新共现次数,比原代码的嵌套循环减少了一半计算量。

二、矩阵形式的共现结果

如果需要更直观的矩阵输出,可以用pandas结合numpy实现:

1. 构建共现矩阵

import pandas as pd
import numpy as np

# 先对订单-产品去重
df_unique = temp_df[['order_id', 'product_no']].drop_duplicates()

# 生成产品索引映射,用于矩阵的行/列定位
products = sorted(df_unique['product_no'].unique())
prod_to_idx = {p: idx for idx, p in enumerate(products)}

# 初始化对称共现矩阵(对角线为0,无需统计自身共现)
cooccur_matrix = np.zeros((len(products), len(products)), dtype=int)

# 遍历每个订单的产品集合,更新矩阵
for _, group in df_unique.groupby('order_id'):
    prod_indices = [prod_to_idx[p] for p in group['product_no']]
    for i in range(len(prod_indices)):
        for j in range(i+1, len(prod_indices)):
            cooccur_matrix[prod_indices[i], prod_indices[j]] += 1
            cooccur_matrix[prod_indices[j], prod_indices[i]] += 1

# 转换为DataFrame,方便查看和后续操作
cooccur_df = pd.DataFrame(cooccur_matrix, index=products, columns=products)

# 同步生成每个产品的订单出现次数
product_counts = df_unique['product_no'].value_counts().reindex(products).fillna(0).astype(int)

2. 矩阵结果说明

  • cooccur_df.loc[p1, p2]表示产品p1与p2共同出现在同一订单的次数
  • product_counts存储每个产品对应的订单出现次数,可单独使用或合并到矩阵的备注信息中

三、性能对比

  • 原暴力循环:时间复杂度为O(N*M²),其中N是订单数,M是单订单平均产品数
  • 优化后的实现:时间复杂度降至O(N*M²/2),且借助pandas的底层优化减少了Python循环的开销,万级以上订单场景下性能提升显著

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:31:17