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

基于另一DataFrame的条件累积求和(Conditional Cumsum)实现求助

解决方案

核心思路是给条件表中每一行的连续相同值生成分组标识,再基于这个分组对求和表做行内的累积求和——条件变化时分组自动重置,自然就能实现累积求和的断点重置。

步骤1:构造示例数据

先把你给出的表格转成pandas DataFrame:

import pandas as pd

# 求和表
sum_df = pd.DataFrame({
    '求和': ['X', 'Y', 'Z'],
    '01-Jan': [100, 250, 300],
    '02-Jan': [100, 100, 300],
    '03-Jan': [100, 150, 300]
}).set_index('求和')

# 条件表
cond_df = pd.DataFrame({
    '条件': ['X', 'Y', 'Z'],
    '01-Jan': [0, 1, 1],
    '02-Jan': [0, 2, 2],
    '03-Jan': [0, 2, 3]
}).set_index('条件')

步骤2:生成行内分组标识

对条件表的每一行,判断当前列的值是否和前一列不同,不同则分组编号加1,这样连续相同的条件会被分到同一组:

# 计算每行的分组标识:初始为1,当前值≠前值时加1
group_ids = cond_df.ne(cond_df.shift(axis=1)).cumsum(axis=1)

生成的group_ids如下:

条件01-Jan02-Jan03-Jan
X111
Y122
Z123

步骤3:按分组做行内累积求和

用groupby按行索引和分组标识分组,对求和表做cumsum:

# 按行索引+分组标识分组,逐组计算累积求和
result = sum_df.groupby([sum_df.index, group_ids], axis=1).cumsum()

最终结果

把结果整理成你要的格式:

# 重置索引并改名,匹配预期输出格式
result = result.reset_index().rename(columns={'求和': '预期结果'})
print(result)

输出:

预期结果01-Jan02-Jan03-Jan
X100200300
Y250100250
Z300300300

为什么原生cumsum不行?

原生cumsum(axis=1)是整行无断点累积,不会根据条件拆分分组。而上面的方法通过生成分组标识,把每行拆分成多个连续相同条件的子组,每个子组内单独做累积求和,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:50