如何将Pandas DataFrame拆分为滚动的小型子DataFrame
Python生成滚动窗口子DataFrame列表解决方案
核心逻辑
对于10行的DataFrame,窗口大小为5时,有效窗口数为10 - 5 + 1 = 6,对应起始行索引0到5,分别截取i到i+4(共5行)的子DataFrame即可,这和R中用lapply遍历起始索引的思路一致。
正确代码实现
import pandas as pd # 假设small2是你的10×10 DataFrame window_size = 5 # 计算有效窗口总数 total_windows = len(small2) - window_size + 1 # 用列表推导式生成滚动窗口子DataFrame列表,等效于R的lapply rolling_subdfs = [small2.iloc[i:i+window_size, :] for i in range(total_windows)]
代码说明
len(small2)获取DataFrame总行数,通过总行数-窗口大小+1得到正确的窗口数量(6个)range(total_windows)生成0到5的起始索引,对应每个窗口的第一行位置iloc[i:i+window_size, :]通过位置索引截取连续5行、所有列的子DataFrame,这是Python中定位行切片的标准写法(替代R的x:y语法)
你之前的问题分析
- 用冒号语法报错:Python中不能直接像R那样用
small2[1:5]的方式按行切片(除非DataFrame的行索引是连续整数且未修改),必须用iloc明确指定位置索引,否则会触发索引匹配错误。 - 生成10个元素:大概率是遍历了0到9的所有行索引,而非仅0到5的起始索引,导致多生成了4个不满足5行要求的窗口(比如起始索引6时,只能取到6-9共4行)。
验证结果
可以通过以下代码确认每个子DataFrame的行数:
for idx, sub_df in enumerate(rolling_subdfs): print(f"第{idx+1}个窗口行数: {len(sub_df)}")
输出会显示6个窗口,每个窗口行数均为5。
内容的提问来源于stack exchange,提问作者jlewis
相关产品推荐
相关产品推荐

