基于Pandas按name分组,对a列连续值对应val列求和生成sum_val列
解决按分组计算连续相邻值对应列求和的问题
我来帮你搞定这个需求!你想要按name分组,把a列里连续相邻数值对应的val求和,再给每一行添上这个求和值作为sum_val列,下面是具体的实现方法:
思路拆解
- 标记连续序列:先按
name分组,在每个组内判断当前行的a值和前一行是否连续(差值为1),不连续的位置就作为新序列的起点,生成子组标签。 - 计算子组求和:用上面的子组标签,对每个子组的
val求和。 - 映射回原数据:把每个子组的求和结果对应到组内的每一行,得到
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
相关产品推荐
相关产品推荐

