通过 ID 重塑数据框

问题描述 投票:0回答:1

我有一个包含 1 个 ID 列和 24 个值列的数据框。一个ID有49行数据。我想为每个 ID 将这个 49x24 重塑为 7x168 形状,并保留顺序,以便每个较低的行都附加到上面的行。所以输入数据帧就像(两者都有随机数):

    ID  Column_1  Column_2  ...  Column_22  Column_23  Column_24
0    1        39        86  ...         74         89         91
1    1        37        25  ...         71         66          6
2    1         6        77  ...         61         17         49
3    1        71        27  ...         47         42         39
...
46   1        45        95  ...         58         62         49
47   1        91        42  ...         34          2         80
48   1        38        23  ...         74         80         79

我希望输出是:

    ID  Column_1  Column_2  ...  Column_166  Column_167  Column_168
0    1        64        33  ...          67          40          32
1    1        64        11  ...          37          50           2
2    1        37        13  ...          52          16          41
3    1        50        98  ...          24          87          61
4    1        11         6  ...          96          46          88
5    1        38        91  ...          46          92          17
6    1        49        58  ...          13          46          20

然后对数据框中的数千个 ID(随机数)执行相同的操作

我已经尝试过基本上应该可以工作的循环,但是使用这种大小的数据帧运行它们需要非常长的时间。我还没有找到任何更简单的方法来进行这种重塑

编辑:所以此代码应该生成示例输入数据帧,但只有 4 个不同的 id,每个 id 4 行,每个 id 7 列:

import pandas as pd

ids = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]

columns_data = []
for i in range(1, 8):
    column_data = [i + 7 * j for j in range(len(ids))]
    columns_data.append(column_data)

data = {'ID': ids}
for i in range(7):
    column_name = f'Column_{i + 1}'
    data[column_name] = columns_data[i]

df = pd.DataFrame(data)

print(df)
    ID  Column_1  Column_2  Column_3  Column_4  Column_5  Column_6  Column_7
0    1         1         2         3         4         5         6         7
1    1         8         9        10        11        12        13        14
2    1        15        16        17        18        19        20        21
3    1        22        23        24        25        26        27        28
4    2        29        30        31        32        33        34        35
5    2        36        37        38        39        40        41        42
6    2        43        44        45        46        47        48        49
7    2        50        51        52        53        54        55        56
8    3        57        58        59        60        61        62        63
9    3        64        65        66        67        68        69        70
10   3        71        72        73        74        75        76        77
11   3        78        79        80        81        82        83        84
12   4        85        86        87        88        89        90        91
13   4        92        93        94        95        96        97        98
14   4        99       100       101       102       103       104       105
15   4       106       107       108       109       110       111       112

并且可以使用以下代码创建所需的输出:

import pandas as pd

ids = [1, 1, 2, 2, 3, 3, 4, 4,]

columns_data = []
for i in range(1, 15):
    column_data = [i + 14 * j for j in range(len(ids))]
    columns_data.append(column_data)

data = {'ID': ids}
for i in range(14):
    column_name = f'Column_{i + 1}'
    data[column_name] = columns_data[i]

df = pd.DataFrame(data)

print(df)
   ID  Column_1  Column_2  Column_3  ...  Column_11  Column_12  Column_13  Column_14
0   1         1         2         3  ...         11         12         13         14
1   1        15        16        17  ...         25         26         27         28
2   2        29        30        31  ...         39         40         41         42
3   2        43        44        45  ...         53         54         55         56
4   3        57        58        59  ...         67         68         69         70
5   3        71        72        73  ...         81         82         83         84
6   4        85        86        87  ...         95         96         97         98
7   4        99       100       101  ...        109        110        111        112
python dataframe reshape
1个回答
0
投票

假设每个 ID 有 X*Y 行/列,并且希望将每个 ID 重塑为 N 行,其中 X 是 N 的倍数,并且这些 ID 分组在一起。

您可以使用

reshape
:

N = 2

IDs = df['ID'].unique()
out = (pd.DataFrame(df.drop(columns='ID').to_numpy().reshape(N*len(IDs), -1))
         .rename(columns=lambda x: f'Column_{x+1}')
      )
out.insert(0, 'ID', IDs[np.arange(len(out))//N])

输出:

   ID  Column_1  Column_2  Column_3  Column_4  Column_5  Column_6  Column_7  Column_8  Column_9  Column_10  Column_11  Column_12  Column_13  Column_14
0   1         1         2         3         4         5         6         7         8         9         10         11         12         13         14
1   1        15        16        17        18        19        20        21        22        23         24         25         26         27         28
2   2        29        30        31        32        33        34        35        36        37         38         39         40         41         42
3   2        43        44        45        46        47        48        49        50        51         52         53         54         55         56
4   3        57        58        59        60        61        62        63        64        65         66         67         68         69         70
5   3        71        72        73        74        75        76        77        78        79         80         81         82         83         84
6   4        85        86        87        88        89        90        91        92        93         94         95         96         97         98
7   4        99       100       101       102       103       104       105       106       107        108        109        110        111        112
© www.soinside.com 2019 - 2024. All rights reserved.