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.]])