Pandas按多列分组计算组内首段连续True值的累计和实现问题
实现方法
核心逻辑
你需求的本质是:每个分组按原始顺序遍历,只要遇到第一个False就停止统计D列的True值,后续所有值忽略。我们可以通过两个步骤实现分组内的计算:
- 标记分组内已经出现过
False的行(遇到第一个False之后的所有行都标记为无效) - 仅对有效行的
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完全匹配你的预期:
| A | B | C | 目标列最大值 |
|---|---|---|---|
| 100 | AAA | 001 | 0 |
| 200 | BBB | 055 | 3 |
| 300 | CCC | 099 | 0 |
内容的提问来源于stack exchange,提问作者Mario Gabriel
相关产品推荐
相关产品推荐

