Pandas。 "shifting" 将 n 个别有用心的行值转换为先前行值的最佳方法是什么? (乘以第 1 列)

Pandas. Which is the best way of "shifting" the n ulterior row values into precedent row values? (multiplying columns-1)

在第一种情况下,行的分组是两个,但我们的想法是将其概括为 N 行的分组。

想法是转这个:

df

    x1  x2  x3  y
0   1   2   3   NaN
1   5   6   7   8
2   9   10  11  12
3   13  14  15  16
4   17  18  19  NaN

进入这个:

df_grouped2
    x1  x2  x3  x4  x5  x6  y
0   1   2   3   5   6   7   8
1   5   6   7   9   10  11  12
2   9   10  11  13  14  15  16
3   13  14  15  17  18  19  NaN

如果我们将原始 df 分组为 3 行得到:

df_grouped3


    x1  x2  x3  x4  x5  x6  x7  x8  x9  y
0   1   2   3   5   6   7   9   10  11  12
1   5   6   7   9   10  11  13  14  15  16
2   9   10  11  13  14  15  17  18  19  NaN

我找不到执行此操作的函数或方法。我正在尝试创建一个函数来执行此操作,但我想到的想法是 迭代和详尽 (遍历整个数据集)。

我不知道 pandas 函数(如 "pivot" 或 "shift" 的某些组合是否可以更简单的方式 完成。

有什么想法吗?

提前致谢。

设x为原始数据框,

z = x.shift(-1)
z.columns = ['x4','x5','x6','y']
col = set(x.columns)
col.remove('y')
xt = x[col]
pd.concat([xt,z],axis=1,sort=False).iloc[:-1]

对于 N = 3:

z2 = x.shift(-2)
z2.columns = ['x7','x8','x9','y']
col = set(z.columns)
col.remove('y')
zt = z[col]
pd.concat([xt,zt,z2],axis=1,sort=False).iloc[:-2]

Note: For generation N , use x.shift(-1) , x.shift(-2) until x.shift(-(N-1)), You can implement this using a for loop

@Nonamecpp

谢谢!不错的方法,按照这个想法,我试图将其概括为一个函数,但我遇到了一个问题,我看不到解决方案。

当我 运行 函数用于两个以上的行分组时,输出生成错误的列(具有不必要的行值)。

函数:

def move(df,row_agruped):

    while row_agruped > 2:
        df = move(df,2)
        row_agruped = row_agruped-1

    x = df
    z = x.shift(-1)

    num_cols = len(x.columns)

    rng = range(num_cols, num_cols-1 +((num_cols)))


    new_cols = ['x'+str(i) for i in rng] + ['y']

    z.columns = new_cols

    xt = x.iloc[:,:len(x.columns)-1]

    return pd.concat([xt,z],axis=1,sort=False).iloc[:((row_agruped)-3)]

对于 N=3,函数 return 是这样的:

move(x,3)


    x1  x2  x3  x4    x5    x6    x7    x8    x9    x10     x11     x12    y
0   1   2   3   5.0   6.0   7.0   5.0   6.0   7.0   9.0     10.0    11.0   12
1   5   6   7   9.0   10.0  11.0  9.0   10.0  11.0  13.0    14.0    15.0   16
2   9   10  11  13.0  14.0  15.0  13.0  14.0  15.0  17.0    18.0    19.0   NaN

(注意 x4 == x7、x5 == x8、x6 == x9 列中的错误)

但它应该return这样:

    x1  x2  x3  x4      x5      x6      x7      x8      x9      y
0   1   2   3   5.0     6.0     7.0     9.0     10.0    11.0    12
1   5   6   7   9.0     10.0    11.0    13.0    14.0    15.0    16
2   9   10  11  13.0    14.0    15.0    17.0    18.0    19.0    NaN