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

当条件不满足时重置Pandas的cumsum累计求和

解决方案

你需要先在每个A-B分组内识别出连续相同C值的区块,再在每个区块内做累计计数,这样就能在C值变化时重置累计值。具体代码如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'A': ['group1']*6,
    'B': ['group1_c']*6,
    'C': [12,12,12,1,12,12]
})

# 1. 分组内标记C值变化的位置
df['change_flag'] = df.groupby(['A','B'])['C'].apply(lambda x: x != x.shift()).astype(int)

# 2. 分组内生成连续相同C值的区块ID
df['block_id'] = df.groupby(['A','B'])['change_flag'].cumsum()

# 3. 每个区块内计算累计值
df['cumul'] = df.groupby(['A','B','block_id']).cumcount()

# 可选:删除中间辅助列
df = df.drop(['change_flag','block_id'], axis=1)

执行后得到的结果与你的期望一致:

ABCcumul
group1group1_c120
group1group1_c121
group1group1_c122
group1group1_c10
group1group1_c120
group1group1_c121

代码说明

  • 步骤1:通过groupby(['A','B'])限定仅在同一分组内比较,x != x.shift()会将当前行与前一行C值不同的位置标记为True,转为整数后用1表示变化点、0表示无变化。
  • 步骤2:对变化标记做分组内累加,每遇到一个变化点,区块ID就会递增,确保同一连续相同C值的行归属同一个区块。
  • 步骤3:cumcount()会在每个A-B-区块ID的分组内从0开始计数,完美实现“连续匹配时累计,不匹配时重置为0”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:40:34