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

Python中高效实现Excel SUMIF等价功能的优化问询

问题:Python实现高效SUMIF替代方案

我正在用Python实现Excel的SUMIF等价功能,当前代码能运行但效率极低,耗时长达20分钟。以下是简化后的代码和数据示例(实际代码包含更多条件),寻求最高效的实现方法。

数据示例

sales_data(customer_1)

TransactionsProduct Dimension 4Product Dimension 2Product Dimension 3sum_of_sales
150F80ETQ54680
250F80SAS97820
350C36JBH14810
450F80ETQ54680
550F80SAS97820
650C36JBH14810
720A20OPW26915
820A20DUW98765
920v90OWQ89747

condition_types(添加SUMIF前)

TransactionsTypeProduct Dimensions
customer_1ABC50
customer_1DEFF80
customer_1GHIJBH148

condition_types(添加SUMIF后)

TransactionsTypeProduct Dimensionssum_of_sales
customer_1ABC50220
customer_1DEFF80200
customer_1GHIJBH14820

原低效代码

定义SUMIF函数

def sumif(row, value_column):
    if row['Type'] == "ABC":
        filtered_data = sales_data.loc[
            (sales_data['Product_dimension_4'] == row['Product Dimensions'])
        ]
    elif row['Type'] == "DEF" and row['Product Dimensions'] in sales_data['Product_dimension_2'].unique():
        filtered_data = sales_data.loc[
            (sales_data['Product_dimension_2'] == row['Product Dimensions'])
        ]

    elif row['Type'] == "GHI" and row['Product Dimensions'] in sales_data['Product_dimension_3'].unique():
        filtered_data = sales_data.loc[
            (sales_data['Product_dimension_3'] == row['Product Dimensions'])
        ]

    else:
        return 0  # 返回0而非空值以保证一致性
    
    return filtered_data[value_column].sum()

应用函数

condition_types['sum_of_sales'] = condition_types.apply(lambda row: sumif(row, value_column="sum_of_sales"), axis=1)

高效优化方案

原代码慢的核心原因是逐行循环+重复过滤全表,每次apply都会遍历整个sales_data,时间复杂度为O(M*N)(M是condition_types行数,N是sales_data行数)。优化思路是预计算各维度的求和结果,再通过字典映射快速查找,时间复杂度降为O(M+N)。

步骤1:预计算各维度求和字典

# 预计算每个维度的sum_of_sales总和,转为字典
dim4_sum = sales_data.groupby('Product Dimension 4')['sum_of_sales'].sum().to_dict()
dim2_sum = sales_data.groupby('Product Dimension 2')['sum_of_sales'].sum().to_dict()
dim3_sum = sales_data.groupby('Product Dimension 3')['sum_of_sales'].sum().to_dict()

步骤2:快速映射计算结果

用np.select实现多条件快速映射:

import numpy as np

# 定义条件列表和对应的值列表
conditions = [
    condition_types['Type'] == 'ABC',
    condition_types['Type'] == 'DEF',
    condition_types['Type'] == 'GHI'
]

choices = [
    condition_types['Product Dimensions'].map(dim4_sum).fillna(0),
    condition_types['Product Dimensions'].map(dim2_sum).fillna(0),
    condition_types['Product Dimensions'].map(dim3_sum).fillna(0)
]

# 应用映射
condition_types['sum_of_sales'] = np.select(conditions, choices, default=0)

优化优势

  1. groupby.sum()仅遍历一次sales_data,完成所有分组求和的预计算
  2. map基于哈希表实现O(1)查找,远快于逐行过滤全表的操作
  3. 消除了原代码中重复调用unique()的额外性能开销

若实际代码有更多Type条件,只需扩展conditions和choices列表即可,保持同样的高效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:56:08