如何在Python列表中反向循环取4个值并对全量元素执行对应计算
实现方案
逻辑说明
你需要的是固定窗口大小的滑动加权计算:每个位置的结果由当前位置及向前取最多3个元素(共4个元素,索引越界时取值为0),分别与list2的权重按顺序相乘后求和,计算前需先将DataFrame中的空值填充为0。
方法1:纯Python原生实现
适合小数据量场景,逻辑直观:
import pandas as pd # 先处理原始DataFrame,填充空值 df['目标列名'] = df['目标列名'].fillna(0) list1 = df['目标列名'].tolist() list2 = [0.27, 0.29, 0.24, 0.18] window_size = len(list2) result = [] for idx in range(len(list1)): current_sum = 0 for offset in range(window_size): # 向前取offset位,索引小于0时取值为0 val = list1[idx - offset] if idx - offset >= 0 else 0 current_sum += val * list2[offset] result.append(round(current_sum, 4)) # 保留小数位数可按需调整
方法2:pandas滚动窗口实现
适合大数据量场景,运算效率更高:
import pandas as pd list2 = [0.27, 0.29, 0.24, 0.18] # 直接在DataFrame列上操作,先填充空值 df['目标列名'] = df['目标列名'].fillna(0) # 滚动窗口计算,窗口大小为4,不足4个元素时按实际存在的元素计算 df['计算结果'] = df['目标列名'].rolling(window=4, min_periods=1).apply( lambda x: (x * list2[::-1][-len(x):]).sum() ) # 可按需转为列表 result = df['计算结果'].tolist()
两种方法输出的结果长度与list1完全一致,可覆盖所有元素的计算需求。
内容的提问来源于stack exchange,提问作者Akilesh
相关产品推荐
相关产品推荐

