在 .loc 中使用 for 循环索引来访问数据帧的滚动切片?

Using a for loop index in .loc to access a rolling slice of a dataframe?

我想创建主数据帧的滚动切片。我正在尝试衡量滚动期间结果的差异。主数据框有 120 年的数据,我想创建一个列的 10 年的滚动切片,即第一个切片从第 1 年到第 10 年,第 2 个切片从第 2 年到第 11 年,等等...

我正在尝试创建一个包含所有切片的切片数据框,在我的示例中有 12 个滚动的 10 年周期。

我正尝试在这样的 for 循环中执行此操作:

length_of_slice = 10
slice_df = pd.DataFrame(index=range(length_of_slice)) 
   
for i in range(0, len(slice_df)):

       slice_df['Data'+ str(i)] = master_df.loc[i:(i+9)]['Data'].to_list()

所以,第一个 运行 通过这个应该给我 slice_df 的 10 行中 master _df 的第 0 到 9 行。第二次循环应该给我 slice_df 的 10 行中 master_df 的第 1 到 10 行。

我不断收到 ValueError:值的长度与索引的长度不匹配。 我可以像这样在 .loc 中使用 for 循环的索引吗?有更好的方法吗?

如果我在 for 循环之外按顺序执行这些步骤,它就可以工作。

slice_df['Data1'] = master_df.loc[0:9]['Data'].to_list()
slice_df['Data2'] = master_df.loc[1:10]['Data'].to_list()
...

所以,这是我在 for 循环中做的事情。

一个选项是迭代 rolling 的输出。

import numpy as np 
import pandas as pd 

n = 10
master_df = pd.DataFrame({"Data": np.random.randint(0, 99, size=20)})
slice_df = pd.DataFrame([list(i) for i in master_df["Data"].rolling(n)]).dropna().T

slice_df.columns = [f"Data{i}" for i, _ in enumerate(slice_df, start=1)]

会给你例如

   Data1  Data2  Data3  Data4  Data5  Data6  Data7  Data8  Data9  Data10  Data11
0   31.0   84.0   85.0    7.0   71.0   58.0   88.0   83.0   17.0    98.0    57.0
1   84.0   85.0    7.0   71.0   58.0   88.0   83.0   17.0   98.0    57.0    23.0
2   85.0    7.0   71.0   58.0   88.0   83.0   17.0   98.0   57.0    23.0    74.0
3    7.0   71.0   58.0   88.0   83.0   17.0   98.0   57.0   23.0    74.0    75.0
4   71.0   58.0   88.0   83.0   17.0   98.0   57.0   23.0   74.0    75.0    76.0
5   58.0   88.0   83.0   17.0   98.0   57.0   23.0   74.0   75.0    76.0    30.0
6   88.0   83.0   17.0   98.0   57.0   23.0   74.0   75.0   76.0    30.0    93.0
7   83.0   17.0   98.0   57.0   23.0   74.0   75.0   76.0   30.0    93.0    96.0
8   17.0   98.0   57.0   23.0   74.0   75.0   76.0   30.0   93.0    96.0    71.0
9   98.0   57.0   23.0   74.0   75.0   76.0   30.0   93.0   96.0    71.0    58.0