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

基于Pandas按name分组,对a列连续值对应val列求和生成sum_val列

解决按分组计算连续相邻值对应列求和的问题

我来帮你搞定这个需求!你想要按name分组,把a列里连续相邻数值对应的val求和,再给每一行添上这个求和值作为sum_val列,下面是具体的实现方法:

思路拆解

  1. 标记连续序列:先按name分组,在每个组内判断当前行的a值和前一行是否连续(差值为1),不连续的位置就作为新序列的起点,生成子组标签。
  2. 计算子组求和:用上面的子组标签,对每个子组的val求和。
  3. 映射回原数据:把每个子组的求和结果对应到组内的每一行,得到sum_val列。

完整代码实现

import pandas as pd

# 初始化原DataFrame
df1 = {'name': ["x","x","x","x","x","x","x","y","y","y","y","y","y","y"], 
       'a': [3,4,5,11,14,15,16,2,3,4,10,13,14,15], 
       'b': [9,8,7,12,23,22,21,8,7,6,11,22,21,20], 
       'val': [2,1,3,4,5,6,3,21,11,31,41,51,61,31] }
df1 = pd.DataFrame(df1, columns = ['name','a','b','val'])

# 核心处理逻辑
df1['sum_val'] = df1.groupby(
    ['name', df1.groupby('name')['a'].diff().ne(1).cumsum()]
)['val'].transform('sum')

# 验证结果
print(df1)

代码细节解释

  • df1.groupby('name')['a'].diff().ne(1):在每个name组内,计算当前a与前一行a的差值,判断是否不等于1(即不连续),生成布尔序列。
  • .cumsum():对布尔序列累加,每遇到一个不连续的位置,累加值就加1,这样连续的行会被归为同一个子组。
  • groupby(...)['val'].transform('sum'):按name和子组标签分组,计算每个子组的val总和,再用transform把总和映射回每一行,确保每行都能拿到自己所在连续序列的求和值。

运行后得到的结果和你期望的df2完全一致哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:17:26