如何使用Python Pandas实现类似Excel SUMIFS的多条件求和
Pandas实现等效Excel SUMIFS多条件跨周期聚合方法
核心逻辑
针对「固定维度列 + 连续周期数值列」结构的DataFrame,不需要手动枚举所有周期列,代码可自动适配到表中最后一个周期列,一次性完成所有周期维度的多条件求和,完全等效Excel逐列写SUMIFS公式的效果,计算效率远高于Excel公式。
实现步骤
- 第一步:导入依赖、对齐目标数据结构
import pandas as pd import numpy as np # 示例数据结构和描述完全一致,包含Location/Team/Asset三个维度列,后续为P01-P04及更多周期列 df = pd.DataFrame({ 'Location': ['England', 'England', 'Scotland', 'England', 'Scotland'], 'Team': ['A', 'A', 'B', 'B', 'B'], 'Asset': ['X', 'Y', 'X', 'X', 'Y'], 'P01': [10, 20, 15, 5, 8], 'P02': [12, 22, 17, 7, 10], 'P03': [14, 24, 19, 9, 12], 'P04': [16, 26, 21, 11, 14] })
- 第二步:自动识别列范围,无需手动写死周期列名
自动截取维度列之后的所有列作为周期计算范围,后续新增P05、P06等周期列时不需要修改代码
# 指定作为聚合匹配条件的维度列 dim_cols = ['Location', 'Team', 'Asset'] # 自动提取从维度列结束位置到表尾的所有周期列 period_cols = df.columns[len(dim_cols):].tolist()
- 第三步:执行多条件聚合,等效全周期SUMIFS计算
# 按指定维度列分组,对所有周期列求和,结果结构和预期目标表完全一致 sumifs_result = df.groupby(dim_cols, as_index=False)[period_cols].sum()
常见调整方案
- 如果不需要按全维度聚合,比如只按
Location、Team两个维度汇总、不区分Asset,直接修改dim_cols列表为对应列名即可 - 如果聚合前需要先筛选数据(比如仅计算England地区的数值),先做行筛选再聚合即可:
england_result = df[df['Location'] == 'England'].groupby(dim_cols, as_index=False)[period_cols].sum()
- 如果需要生成各维度小计、总计,可以用透视表实现:
pivot_total_result = pd.pivot_table( df, index=dim_cols, values=period_cols, aggfunc=np.sum, margins=True, margins_name='总计' ).reset_index()
和Excel SUMIFS的对应关系
- 上述代码的逻辑等价于:在Excel中对每一个周期列单独编写SUMIFS公式,将
dim_cols中的列作为匹配条件列,逐列向右填充公式到最后一个周期列。Pandas向量化计算不会出现公式引用错位问题,十万行以上数据的计算速度比Excel快数十倍。
内容的提问来源于stack exchange,提问作者Brad Scott
相关产品推荐
相关产品推荐

