如何用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
相关产品推荐
相关产品推荐

