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

