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

如何在Pandas动态窗口(自定义窗口)中计算过滤后列的求和

解决Pandas中基于行定义的动态窗口求和问题

你的需求是:对每一行数据,计算同code分组内,group_index落在当前行index_start到group_index区间内的price总和。

原代码的问题

你当前的代码逻辑里,apply返回的是过滤后的price Series对象,直接赋值给sum列后,每个元素都是一个小Series,而非单个求和数值;后续的df_dynamic_window['sum'].sum()是把所有这些Series的元素全部加总,并非每行对应窗口的单独求和,所以结果不符合预期。

修正后的实现方法

方法1:直接在apply内完成求和(简单直观)

修改lambda逻辑,在过滤后直接对price列求和,返回单个数值:

df_dynamic_window['calc_sum'] = df_dynamic_window.apply(
    lambda row: df_dynamic_window.loc[
        (df_dynamic_window['code'] == row['code']) &
        (df_dynamic_window['group_index'] >= row['index_start']) &
        (df_dynamic_window['group_index'] <= row['group_index']),
        'price'
    ].sum(),
    axis=1
)

方法2:分组后处理(提升效率)

如果数据集较大,逐行全局apply效率较低,可以先按code分组,在组内处理减少无效过滤:

def process_group(group):
    group['calc_sum'] = group.apply(
        lambda row: group.loc[
            (group['group_index'] >= row['index_start']) &
            (group['group_index'] <= row['group_index']),
            'price'
        ].sum(),
        axis=1
    )
    return group

df_dynamic_window = df_dynamic_window.groupby('code').apply(process_group)

方法3:迭代分组索引(更灵活)

通过预存分组索引,减少重复的分组判断:

# 先获取每个code对应的行索引集合
code_indices = df_dynamic_window.groupby('code').indices

calc_sum_list = []
for _, row in df_dynamic_window.iterrows():
    # 取出当前code的所有行索引
    group_rows = code_indices[row['code']]
    # 筛选符合区间条件的行
    mask = (df_dynamic_window.loc[group_rows, 'group_index'] >= row['index_start']) & \
           (df_dynamic_window.loc[group_rows, 'group_index'] <= row['group_index'])
    # 计算求和值并加入列表
    calc_sum_list.append(df_dynamic_window.loc[group_rows[mask], 'price'].sum())

df_dynamic_window['calc_sum'] = calc_sum_list

验证结果

执行上述任意方法后,calc_sum列的值会和你提供的SUM dynamic window列完全一致(注意原示例中SUM dynamic window被转成了int32,所以小数会被取整,比如B组的2.4会变成2,2.8变成2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:45:33