如何基于pandas DataFrame生成包含前序行、当前行和后x行的序列
问题解决方案
你的需求是构造包含1个前序行、当前行、x个后续行的序列,过滤首尾无效条目,我们提供两种实现方案:
方案1:索引切片法(更直观易维护)
直接通过数组索引切片构造序列,逻辑完全匹配你的规则,不需要额外处理窗口滑动逻辑:
import numpy as np x = 3 # 替换为你需要的后续行数量 # 拆分特征和标签,和原有代码逻辑保持一致:每行除最后一个元素为特征,最后一个为标签 features = df.iloc[:, :-1].values labels = df.iloc[:, -1].values sequential_data = [] total_row = len(df) # 遍历所有有效当前行的索引:最小为1(有前序行索引0),最大为 total_row - 1 -x(后面有x个后续行) for current_idx in range(1, total_row - x): # 切片范围:前序行(current_idx-1)到最后一个后续行(current_idx +x) seq = features[current_idx - 1 : current_idx + x + 1] # 标签默认取当前行的标签,可根据需求自行调整 current_label = labels[current_idx] sequential_data.append([np.array(seq), current_label])
效果验证
和你给出的示例完全匹配:df为0~10的单列数据、x=3时,current_idx=4对应切片为索引3到7,返回序列为[[3],[4],[5],[6],[7]]。
方案2:deque改造方案(和原有代码风格一致)
如果你希望沿用原有deque滑动窗口的写法,可以调整窗口大小和标签匹配逻辑:
import numpy as np from collections import deque sequential_data = [] x = 3 # 替换为你需要的后续行数量 window_size = x + 2 # 窗口总长度:1前序 +1当前 +x后续 slide_window = deque(maxlen=window_size) all_rows = [] # 存储所有行的特征和标签,用于后续匹配当前行的标签 for row in df.values: feat = [n for n in row[:-1]] label = row[-1] all_rows.append((feat, label)) slide_window.append(feat) # 窗口存满时构造序列 if len(slide_window) == window_size: # 匹配当前行对应的标签:当前行是窗口的第二个元素,对应索引为当前总行数 -x -1 current_label = all_rows[len(all_rows) - x -1][1] sequential_data.append([np.array(slide_window), current_label])
补充说明
如果你不需要拆分特征和标签,希望把整行数据都放入序列,直接把features = df.iloc[:, :-1].values替换为features = df.values即可。
内容的提问来源于stack exchange,提问作者UnknownInnocent
相关产品推荐
相关产品推荐

