首页 > 解决方案 > 熊猫。将 n 个不可告人的行值“转换”为先前行值的最佳方法是什么?(乘以列-1)

问题描述

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

我找不到执行此操作的功能或方法。我正在尝试创建一个函数来做到这一点,但我脑海中的想法是迭代和详尽的(循环所有数据集)。

我不知道是否可以以更简单的方式完成诸如“pivot”或“shift”之类的熊猫功能的组合。

有什么想法?

提前致谢。

标签: pythonpandasdataframepivotshift

解决方案


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

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

但它应该返回这个:

    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

推荐阅读