基于另一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-Jan | 02-Jan | 03-Jan |
|---|---|---|---|
| X | 1 | 1 | 1 |
| Y | 1 | 2 | 2 |
| Z | 1 | 2 | 3 |
步骤3:按分组做行内累积求和
用groupby按行索引和分组标识分组,对求和表做cumsum:
# 按行索引+分组标识分组,逐组计算累积求和 result = sum_df.groupby([sum_df.index, group_ids], axis=1).cumsum()
最终结果
把结果整理成你要的格式:
# 重置索引并改名,匹配预期输出格式 result = result.reset_index().rename(columns={'求和': '预期结果'}) print(result)
输出:
| 预期结果 | 01-Jan | 02-Jan | 03-Jan |
|---|---|---|---|
| X | 100 | 200 | 300 |
| Y | 250 | 100 | 250 |
| Z | 300 | 300 | 300 |
为什么原生cumsum不行?
原生cumsum(axis=1)是整行无断点累积,不会根据条件拆分分组。而上面的方法通过生成分组标识,把每行拆分成多个连续相同条件的子组,每个子组内单独做累积求和,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者WUPD
相关产品推荐
相关产品推荐

