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

如何用Pandas对Column A中0之后的行分组并求和?

解决Pandas DataFrame分组求和问题

针对需求:对Column A中位于0之后的行按Column A的值分组,求和对应Column B的值;0行及非0之后的行保持原样。以下是可复现的解决方案:

步骤说明与代码实现

首先导入依赖并定义输入数据:

import pandas as pd

# 输入数据集
df = pd.DataFrame({'Column A': [0,0,1,1,1,0,-1,-1,0,0,0,1,0,0,0,0,-1],
                   'Column B': [5,3,4,2,1,3,7,5,10,2,3,4,5,5,5,5,5]
                  })

1. 生成分组标识

通过cumsum()生成每个0块对应的分组ID,确保0之后的连续非0行归属同一个分组:

df['group_id'] = df['Column A'].eq(0).cumsum()

2. 计算分组求和值

使用transform为每行计算其所在分组的Column B求和值,0行的求和值即为自身值:

df['total_B'] = df.groupby(['group_id', 'Column A'])['Column B'].transform('sum')

3. 标记需保留的行

对于非0行,仅保留每个(group_id, Column A)分组的第一行;0行全部保留:

mask = df['Column A'] != 0
df['is_first'] = df[mask].groupby(['group_id', 'Column A']).cumcount() == 0
df['is_first'] = df['is_first'].fillna(True)  # 0行默认保留

4. 生成最终结果

筛选需保留的行,替换非0行的Column B为求和值,清理辅助列:

result = df[df['is_first']].copy()
result.loc[mask, 'Column B'] = result.loc[mask, 'total_B']
result = result.drop(columns=['group_id', 'total_B', 'is_first'])

最终结果

处理后的result输出如下:

Column A  Column B
0          0         5
1          0         3
2          1         7
5          0         3
6         -1        12
8          0        10
9          0         2
10         0         3
11         1         4
12         0         5
13         0         5
14         0         5
15         0         5
16        -1         5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:34:52