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

Pandas按多列分组计算组内首段连续True值的累计和实现问题

实现方法

核心逻辑

你需求的本质是:每个分组按原始顺序遍历,只要遇到第一个False就停止统计D列的True值,后续所有值忽略。我们可以通过两个步骤实现分组内的计算:

  1. 标记分组内已经出现过False的行(遇到第一个False之后的所有行都标记为无效)
  2. 仅对有效行的True值求和,就是分组对应的最大值

完整代码

首先导入依赖并构造示例数据:

import pandas as pd

# 构造示例数据
data = {
    'A': [100, 100, 200, 200, 200, 200, 200, 300, 300],
    'B': ['AAA', 'AAA', 'BBB', 'BBB', 'BBB', 'BBB', 'BBB', 'CCC', 'CCC'],
    'C': ['001', '001', '055', '055', '055', '055', '055', '099', '099'],
    'D': [False, False, True, True, True, False, True, False, True]
}
df = pd.DataFrame(data)

如果需要生成中间的「目标列」,可以用groupby + transform实现:

def calc_target_col(group):
    # 标记已经遇到过False的行
    meet_false = (~group['D']).cumsum() > 0
    # 仅统计有效行的True累计和,无效行保持最后一个累计值
    return group['D'].mask(meet_false, 0).cumsum()

df['目标列'] = df.groupby(['A', 'B', 'C'], group_keys=False).apply(calc_target_col)

如果直接要最终的聚合结果(每个分组的目标列最大值),可以直接用更高效的写法,无需生成中间列:

def calc_group_max(group):
    meet_false = (~group['D']).cumsum() > 0
    # 有效行的True总和就是分组最大值
    return group['D'].mask(meet_false, 0).sum()

result = df.groupby(['A', 'B', 'C']).apply(calc_group_max).reset_index(name='目标列最大值')

输出验证

执行上述聚合代码后得到的result完全匹配你的预期:

ABC目标列最大值
100AAA0010
200BBB0553
300CCC0990

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:21:02