Python 熊猫。哪一种是最好的方式;“移位”;将n个其他行值转换为先前行值?(乘列-1)

Python 熊猫。哪一种是最好的方式;“移位”;将n个其他行值转换为先前行值?(乘列-1),python,pandas,dataframe,pivot,shift,Python,Pandas,Dataframe,Pivot,Shift,在第一种情况下,行的分组是两行,但其思想是将其推广到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 x1 x2 x3 x4 x5 x6 x7 x8 x9 y 0 1 2 3 5.0

在第一种情况下,行的分组是两行,但其思想是将其推广到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
    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
为此:

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]
注意:对于第N代,使用x.shift(-1)、x.shift(-2)直到 x、 移位(-(N-1)),您可以使用for循环实现这一点

@诺曼克普

谢谢!很好的方法,遵循这个想法,我试图将其推广到一个函数中,但我有一个问题,我看不到解决方案

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

职能:

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,函数返回:

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中的错误)

但它应该返回以下内容:

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

NaN
是值
np.NaN
还是字符串
'NaN'
?此外,您是否希望将每5行转换为4行,例如,您是否有多个类似4行的块?您是否只需要查找
df.shift(-1)
?@QuangHoang是的,NaN是“非数字”或np.NaN。在这个从到2行分组的特殊情况下,是的,df从5行到4行,但是在这个示例中,如果我们从到3行分组,最终的df将从5行到3行。