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
相关产品推荐
相关产品推荐

