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

Pandas两表关联计算待处理订单总和:求高效优化方案

高效实现按客户编码(CC)和产品编码(SKU)汇总待处理订单(Pendent)的方法

你的核心需求是给table表新增一列,填充tableOV中对应**客户编码(CC)和产品编码(SKU)**的待处理订单(Pendent)总和,原循环遍历的方法在数据量大时效率极低,以下是基于Pandas向量化操作的优化方案:

原代码的问题

原代码通过itertuples循环遍历table的每一行,每次都对tableOV做两次loc筛选求和,这种方式的时间复杂度是O(n*m)(n为table行数,m为tableOV行数),数据量越大,耗时越夸张。

优化方案:分组聚合+表合并

利用Pandas内置的groupby和merge操作,这两个方法都是底层优化的向量化运算,时间复杂度仅为O(n+m),效率提升非常明显。

步骤1:统一字段名与数据类型

首先确保两张表的关联字段(CC、SKU)名称一致,且数据类型统一:

import pandas as pd

# 转换tableOV的字段类型并保持字段名
tableOV['CC'] = tableOV['CC'].astype(str)
tableOV['SKU'] = tableOV['SKU'].astype(str)

# 把table的cc/sku字段重命名为CC/SKU,与tableOV统一,同时转换类型
table['CC'] = table['cc'].astype(str)
table['SKU'] = table['sku'].astype(str)

步骤2:分组计算待处理订单总和

对tableOV按CC和SKU分组,计算每组的Pendent总和:

# 分组聚合,得到每个(CC, SKU)对应的Pendent总和
pendent_total = tableOV.groupby(['CC', 'SKU'])['Pendent'].sum().reset_index()

步骤3:合并到原表

将聚合结果合并到table中,没有匹配项的Pendent值填充为0:

# 左连接合并,保留table的所有行,缺失值补0
table = table.merge(pendent_total, on=['CC', 'SKU'], how='left').fillna({'Pendent': 0})

完整优化代码

import pandas as pd

table = pd.DataFrame(productsCustomerCd)

# 统一字段类型与名称
tableOV['CC'] = tableOV['CC'].astype(str)
tableOV['SKU'] = tableOV['SKU'].astype(str)
table['CC'] = table['cc'].astype(str)
table['SKU'] = table['sku'].astype(str)

# 分组计算总和
pendent_total = tableOV.groupby(['CC', 'SKU'])['Pendent'].sum().reset_index()

# 合并并补0
table = table.merge(pendent_total, on=['CC', 'SKU'], how='left').fillna({'Pendent': 0})

print(table)

这个方案在数据量较大时,性能会比原循环方法提升几十甚至上百倍,完全避免了Python层面的循环开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:05:09