Python处理DataFrame列表时元素意外被遍历两次问题咨询
问题原因
- 最核心的异常来自Pandas的视图机制:你生成
window_data时大概率用了切片操作,而Pandas切片默认返回原数据的视图而非独立副本。你修改任意一个window的price值时,都会直接修改原始数据集的对应数值,后续遍历其他重叠窗口时,取到的price已经是上一轮修改后的归一化值,而非原始价格。相当于对同一个位置的价格做了多次(当前值 / 起始价) -1的计算,多次计算后数值自然会无限接近-1,你观察到的“遍历两次”本质是视图修改导致原始数据被污染的假象。 - 次要问题:
iterrows逐行遍历效率极低,且你没有对输入的DataFrame做副本保护,原始输入数据会被直接修改,影响其他逻辑调用。
修复代码
直接用向量化操作替代逐行遍历,同时生成独立副本避免修改原始数据:
from typing import List from pandas import DataFrame def normalize_windows(window_data: List[DataFrame]): # 仅读取一次原始起始价,不受后续操作影响 starting_price = window_data[0]['price'].iloc[0] normalized_windows = [] for window in window_data: # 生成独立副本,不修改原始输入数据 processed_window = window.copy() # 向量化整列计算,效率远高于逐行遍历 processed_window['price'] = (processed_window['price'] / starting_price) - 1 normalized_windows.append(processed_window) return normalized_windows
内容的提问来源于stack exchange,提问作者Kati
相关产品推荐
相关产品推荐

