在 .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
我想创建主数据帧的滚动切片。我正在尝试衡量滚动期间结果的差异。主数据框有 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