如何用Python原生方法将列表中-99标记的缺失值替换为相邻值均值或相邻值
代码问题说明
你的代码存在三处核心逻辑错误:
- 第一层循环遍历的是外层列表的索引,你没有遍历每个子列表内部的元素,且判断条件写的是
num == missing_value,num是索引值,永远不可能等于-99,这是最直接的错误原因 - 没有处理连续缺失的场景,你写的逻辑只假设缺失值左右都是有效值,完全不符合第二条规则要求
- 直接按索引取前后值没有做边界校验,一旦缺失值出现在列表首尾会直接抛出索引越界错误
正确实现代码
def cleanup(data): missing_value = -99 # 遍历每个子列表 for sub_list in data: n = len(sub_list) for i in range(n): if sub_list[i] != missing_value: continue # 查找左侧最近有效值 left_val = None left_idx = -1 for j in range(i-1, -1, -1): if sub_list[j] != missing_value: left_val = sub_list[j] left_idx = j break # 查找右侧最近有效值 right_val = None right_idx = n for j in range(i+1, n): if sub_list[j] != missing_value: right_val = sub_list[j] right_idx = j break # 按规则赋值 if left_val is not None and right_val is not None: # 单个缺失:左右相邻都是有效值,取平均 if left_idx == i-1 and right_idx == i+1: sub_list[i] = (left_val + right_val) // 2 else: # 连续缺失:取距离更近的有效值,距离相同取左侧 left_dist = i - left_idx right_dist = right_idx - i sub_list[i] = left_val if left_dist <= right_dist else right_val # 只有单侧有效值时直接取对应值 elif left_val is not None: sub_list[i] = left_val elif right_val is not None: sub_list[i] = right_val return data # 测试运行 data = [[1, 2, -99, 4, 5], [1, 2, -99, -99, 5],[1, 2, 3, -99, -99]] print(cleanup(data))
运行输出
[[1, 2, 3, 4, 5], [1, 2, 2, 5, 5], [1, 2, 3, 3, 3]]
内容的提问来源于stack exchange,提问作者Hidden Angle
相关产品推荐
相关产品推荐

