代码之家  ›  专栏  ›  技术社区  ›  Binyamin Even

Pandas-取N个先前的值并从序列中创建矩阵

  •  1
  • Binyamin Even  · 技术社区  · 4 年前

    假设我有这个系列:

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

    我试过用 rolling 但没有弄清楚如何达到预期的效果。

    1 回复  |  直到 4 年前
        1
  •  1
  •   BENY    4 年前

    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
    
        2
  •  0
  •   Andy L.    4 年前

    混合的 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 努比

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