Python 通过滚动行来创建新的数据帧

Python 通过滚动行来创建新的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我试图通过在窗口中滚动行值来创建一个新的数据帧。i、 e A R N D C Q -1 -2 -3 -3 -1 -2 -1 -2 -3 -3 -1 -2 -1 -2 -3 -3 -1 -2 -1 -2 -3 -3 -1 -2 对这样的事情: A1 R1 N1 D1 C1 Q1 A2 R2 N2 D2 C2 Q2 … An Rn Nn Dn Cn Qn -1 -2 -3 -3 -1 a

我试图通过在窗口中滚动行值来创建一个新的数据帧。i、 e

A   R   N   D   C   Q
-1  -2  -3  -3  -1  -2
-1  -2  -3  -3  -1  -2
-1  -2  -3  -3  -1  -2
-1  -2  -3  -3  -1  -2
对这样的事情:

A1  R1  N1  D1  C1  Q1  A2  R2  N2  D2  C2  Q2  …   An  Rn  Nn  Dn  Cn  Qn
-1  -2  -3  -3  -1  a   -1  -2  -3  -3  -1  b                           
-1  -2  -3  -3  -1  b   -1  -2  -3  -3  -1  c                           
-1  -2  -3  -3  -1  c   -1  -2  -3  -3  -1  d                           
-1  -2  -3  -3  -1  d                                                   
.   .   .   .   .   .                                                   
它类似于字符串中的滚动窗口,即。 带有窗口3的
检查将产生
EXA,XAM
。这里的关键区别在于,我尝试按行创建窗口,而不是字母。这个新的数据帧将用于训练支持向量机。虽然我可以创建另一个列,其缩放值与其他列相对应(单个列更容易滚动),但我认为我会丢失一些信息,这就是为什么我选择完整的列

本质上,我正在尝试这样做,但对于
n
窗口大小:


您可以使用numpy索引来完成以下任务:

In [1]: import pandas as pd
   ...: import numpy as np
   ...: import string
   ...: 

In [2]: abc = list(string.ascii_letters.upper())
   ...: df = pd.DataFrame(dict(a=abc, b=abc[::-1]))
   ...: df.head()
   ...: 
Out[2]: 
   a  b
0  A  Z
1  B  Y
2  C  X
3  D  W
4  E  V

In [3]: # construct a indexing array
   ...: n = 5
   ...: vals = df.values
   ...: idx = np.tile(np.arange(n), (len(df) - n + 1, 1)) + np.arange(len(df) - n + 1).reshape(-1,1)
   ...: idx[:10]
   ...: 
Out[3]: 
array([[ 0,  1,  2,  3,  4],
       [ 1,  2,  3,  4,  5],
       [ 2,  3,  4,  5,  6],
       [ 3,  4,  5,  6,  7],
       [ 4,  5,  6,  7,  8],
       [ 5,  6,  7,  8,  9],
       [ 6,  7,  8,  9, 10],
       [ 7,  8,  9, 10, 11],
       [ 8,  9, 10, 11, 12],
       [ 9, 10, 11, 12, 13]])

In [4]: # construct columns and index using flattened index array
   ...: cols = [ "{}_{}".format(c,str(i)) for i in range(n) for c in df.columns]
   ...: df2 = pd.DataFrame(vals[idx.flatten()].reshape(len(df)-n+1,df.shape[1]*n), columns=cols)
   ...: df2.head()
   ...: 
Out[4]: 
  a_0 b_0 a_1 b_1 a_2 b_2 a_3 b_3 a_4 b_4
0   A   Z   B   Y   C   X   D   W   E   V
1   B   Y   C   X   D   W   E   V   F   U
2   C   X   D   W   E   V   F   U   G   T
3   D   W   E   V   F   U   G   T   H   S
4   E   V   F   U   G   T   H   S   I   R

谢谢它很有魅力。我会更深入地研究代码,但我想这很好地完成了工作。洪,我在扩展代码时遇到了一些奇怪的事情。在某些情况下,它跳过数据帧中的最后一行。
idx=np.tile(np.arange(5),(len(df)-5,1))+np.arange(len(df)-5)。重塑(-1,1)
I在这里减去5以避免索引错误。这可能就是问题所在。。。您还可以在数据帧的末尾填充NaN。