You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:16:13