首页 > 解决方案 > Pandas 以 .rolling() 方式将列转换为行

问题描述

想象一下我有以下系列:

inp = pd.Series(np.arange(10))

我想要做的是np.array通过以下方式将其转换为:

输入 0 1 2 3 4
0 0
1 0 1
2 0 1 2
3 0 1 2 3
4 0 1 2 3 4
5 1 2 3 4 5
6 2 3 4 5 6

……等等。输出中不会出现名为 input 的列,但我将其放在此处以使我的查询更加清晰。

我尝试的是以下内容:

matrix = [x.to_numpy() for x in list(inp.rolling(window=5, min_periods=5))]

问题是,我不能使用np.stack()on matrix,因为(即使我通过了min_periods=5)列表中每个项目的形状都不同。我也觉得我忽略了一个非常简单的熊猫命令:D。

非常感谢!

编辑:我当前的解决方法是自定义函数。我想有比这个更好的解决方案:

def rolling_transform_series(x):
    length = len(x)
    array = []
    for idx in range(length): 
        s = x[idx-5:idx]
        if idx < 5:
            s = np.r_[np.zeros(5-idx), x[:idx]]
            s[s==0] = np.nan
        array.append(s)
    return np.array(array)

df = inp.apply(rolling_transform_series)

标签: pythonpandasdataframenumpyrolling-computation

解决方案


你可以用 shift 试试:

import pandas as pd
inp = pd.Series(np.arange(10))
pd.DataFrame([inp.shift(s) for s in range(4,-6,-1)])

     0    1    2    3    4    5    6    7    8    9
0  NaN  NaN  NaN  NaN  0.0  1.0  2.0  3.0  4.0  5.0
1  NaN  NaN  NaN  0.0  1.0  2.0  3.0  4.0  5.0  6.0
2  NaN  NaN  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0
3  NaN  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0
4  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0
5  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0  NaN
6  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0  NaN  NaN
7  3.0  4.0  5.0  6.0  7.0  8.0  9.0  NaN  NaN  NaN
8  4.0  5.0  6.0  7.0  8.0  9.0  NaN  NaN  NaN  NaN
9  5.0  6.0  7.0  8.0  9.0  NaN  NaN  NaN  NaN  NaN

推荐阅读