Pandas实现自定义累积求和:中途重置求和起始值
没问题,这是个很常见的需求——我们可以通过分组累积求和或者差值调整的方式来实现你要的效果,下面结合你的例子一步步说明:
分析你的需求
从数据对比能看出来,你需要在指定行(比如行9、行18)重置累积求和的起点:
- 行9之前保持正常的
cumsum()逻辑 - 行9时,累积值直接重置为该行的
Value(343.6),后续行基于这个新起点继续累加 - 行18再次重复这个重置逻辑
方法一:差值调整法(简单直接)
先计算原始的累积和,再针对重置点对后续行的结果做差值修正,适合已知固定重置位置的场景:
import pandas as pd # 先构造你的示例数据 data = { 'Value': [329.6,34.0,10,8,3,-2,-4,-34,-1,343.6,0,-33,-3,0,1,4,0,21,333.6] } df = pd.DataFrame(data) # 1. 计算原始累积和 df['Original Cumulative Sum'] = df['Value'].cumsum() # 2. 定义重置点及其对应的目标累积值 reset_info = {9: 343.6, 18: 333.6} # 3. 创建调整列,用于修正后续行的累积值 df['adjustment'] = 0 # 4. 遍历每个重置点,计算需要减去的差值并应用到后续行 for idx, target_val in reset_info.items(): # 计算原始累积值与目标值的差值 diff = df.loc[idx, 'Original Cumulative Sum'] - target_val # 对当前重置点及之后的所有行应用调整 df.loc[idx:, 'adjustment'] += diff # 5. 得到期望的累积和 df['Expected Cumulative Sum'] = df['Original Cumulative Sum'] - df['adjustment']
运行后,Expected Cumulative Sum列就会完全匹配你想要的结果。
方法二:分组累积法(更灵活)
如果你的重置点不是固定行号,而是基于某种条件(比如当Value等于前一行的累积值时触发重置),可以用分组的方式动态处理:
# 1. 标记重置点:行9、行18标记为1,其他为0 df['reset_flag'] = df.index.isin([9,18]).astype(int) # 2. 生成分组键:每遇到一个重置点,分组号+1 df['group_id'] = df['reset_flag'].cumsum() # 3. 自定义分组内的累积求和逻辑 def custom_cumsum(group): if group['reset_flag'].iloc[0] == 1: # 重置组:第一个值直接取当前Value,后续基于前值累加 cum_list = [group['Value'].iloc[0]] for val in group['Value'].iloc[1:]: cum_list.append(cum_list[-1] + val) return pd.Series(cum_list, index=group.index) else: # 普通组:正常执行cumsum return group['Value'].cumsum() # 4. 应用分组逻辑得到结果 df['Expected Cumulative Sum'] = df.groupby('group_id').apply(custom_cumsum).reset_index(level=0, drop=True)
这种方法的优势是可以灵活修改reset_flag的生成规则,比如改成df['reset_flag'] = (df['Value'] == df['Original Cumulative Sum'].shift(1)).astype(int),就能自动识别需要重置的行。
内容的提问来源于stack exchange,提问作者JonIRE
相关产品推荐
相关产品推荐

