我有一个包含 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
假设每个 ID 有 X*Y 行/列,并且希望将每个 ID 重塑为 N 行,其中 X 是 N 的倍数,并且这些 ID 分组在一起。
您可以使用 numpy 来
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