Python Pandas-取N个以前的值并从系列中创建矩阵

Python Pandas-取N个以前的值并从系列中创建矩阵,python,pandas,Python,Pandas,假设我有这个系列: S = pd.Series([1,1,2,3,5,8,13,21,34]) 我想将其转换为一个矩阵,其中每一行将包含最后的N(假设为:5)个值 因此,输出应为: [[NaN,NaN,NaN,NaN,NaN], [NaN,NaN,NaN,NaN, 1], [NaN,NaN,NaN, 1, 1], [NaN,NaN, 1, 1, 2], [NaN, 1, 1, 2, 3], [ 1, 1, 2, 3, 5], [ 1, 2, 3, 5,

假设我有这个系列:

S = pd.Series([1,1,2,3,5,8,13,21,34])
我想将其转换为一个矩阵,其中每一行将包含最后的
N
(假设为:5)个值

因此,输出应为:

[[NaN,NaN,NaN,NaN,NaN],
 [NaN,NaN,NaN,NaN, 1],
 [NaN,NaN,NaN, 1,  1],
 [NaN,NaN, 1,  1,  2],
 [NaN, 1,  1,  2,  3],
 [ 1,  1,  2,  3,  5],
 [ 1,  2,  3,  5,  8],
 [ 2,  3,  5,  8,  13],
 [ 3,  5,  8,  13, 21]]

Iv'e尝试使用
rolling
,但没有准确地找出如何获得预期结果。

shift
使用
concat

out = pd.concat([S.shift(x) for x in range(1,6)[::-1]],1)
Out[124]: 
     0    1    2     3     4
0  NaN  NaN  NaN   NaN   NaN
1  NaN  NaN  NaN   NaN   1.0
2  NaN  NaN  NaN   1.0   1.0
3  NaN  NaN  1.0   1.0   2.0
4  NaN  1.0  1.0   2.0   3.0
5  1.0  1.0  2.0   3.0   5.0
6  1.0  2.0  3.0   5.0   8.0
7  2.0  3.0  5.0   8.0  13.0
8  3.0  5.0  8.0  13.0  21.0

numpy
pandas

n = 5
a = [np.nan] + S.tolist()
a_out = np.flip(pd.DataFrame([a[:-i][::-1] for i in range(1,n+1)]).to_numpy(), 
                (0,1)).T
    
Out[464]:
array([[nan, nan, nan, nan, nan],
       [nan, nan, nan, nan,  1.],
       [nan, nan, nan,  1.,  1.],
       [nan, nan,  1.,  1.,  2.],
       [nan,  1.,  1.,  2.,  3.],
       [ 1.,  1.,  2.,  3.,  5.],
       [ 1.,  2.,  3.,  5.,  8.],
       [ 2.,  3.,  5.,  8., 13.],
       [ 3.,  5.,  8., 13., 21.]])
或者纯粹的
python
numpy

n = 5
a = S.tolist()
a_out = np.flip([a[:-i][::-1] + [np.nan]*i for i in range(1,n+1)], (0,1)).T

Out[476]:
array([[nan, nan, nan, nan, nan],
       [nan, nan, nan, nan,  1.],
       [nan, nan, nan,  1.,  1.],
       [nan, nan,  1.,  1.,  2.],
       [nan,  1.,  1.,  2.,  3.],
       [ 1.,  1.,  2.,  3.,  5.],
       [ 1.,  2.,  3.,  5.,  8.],
       [ 2.,  3.,  5.,  8., 13.],
       [ 3.,  5.,  8., 13., 21.]])