Pandas生成滑动窗口列表返回表头而非值的原因与解决方法
问题原因与解决方法
为什么只返回表头?
你的代码里,list(data.iloc[i:i + batch_size])这一行是核心问题。当你对pandas的DataFrame切片调用list()时,默认会遍历DataFrame的列标签,而不是内部的数值。因为你的DataFrame只有一列,列标签是0,所以每次循环都会把[0]添加到batches列表里,最终返回的自然是一堆重复的表头列表。
解决方法
要获取滑动窗口的实际数值,你需要明确提取DataFrame中的值,而非直接转换整个切片。这里有几种简单的修正方式:
方法1:使用.values.tolist()提取数值
修改batches.append这一行,先获取切片的数值数组,再转成列表:
import pandas as pd batch_size = 3 data = pd.DataFrame([1,2,3,4,5,6,7,8,9]) def process(data): batches = [] for i in range(len(data) - batch_size + 1): # 提取切片的数值并转成列表 batch = data.iloc[i:i + batch_size].values.tolist() batches.append(batch) return batches print(process(data))
运行结果:
[[[1], [2], [3]], [[2], [3], [4]], [[3], [4], [5]], [[4], [5], [6]], [[5], [6], [7]], [[6], [7], [8]], [[7], [8], [9]]]
方法2:先将DataFrame转为Series(更简洁)
因为你的数据只有一列,先把DataFrame转成Series,这样切片后直接转列表就是数值:
import pandas as pd batch_size = 3 data = pd.DataFrame([1,2,3,4,5,6,7,8,9]) # 转为Series,取第一列 data_series = data.iloc[:, 0] def process(data): batches = [] for i in range(len(data) - batch_size + 1): batch = list(data.iloc[i:i + batch_size]) batches.append(batch) return batches print(process(data_series))
运行结果:
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9]]
如果需要二维结构(每个元素是单个值的列表),可以用[[x] for x in batch]转换。
方法3:使用pandas的rolling函数(更高效)
如果数据量较大,推荐用pandas内置的滑动窗口函数rolling,代码更简洁且性能更好:
import pandas as pd batch_size = 3 data = pd.DataFrame([1,2,3,4,5,6,7,8,9]) def process(data): # 生成滑动窗口并提取数值,过滤掉长度不足的窗口 batches = [window.values.tolist() for window in data.rolling(window=batch_size) if len(window) == batch_size] return batches print(process(data))
结果和方法1一致。
内容的提问来源于stack exchange,提问作者nick ellul
相关产品推荐
相关产品推荐

