我的出发点:
>>> df
UNIQUE ID NAME AGE DEP RANK
0 1 John 10 4th 1
1 2 Priya 11 4th 2
2 3 Jack 15 5th 2
3 4 Jill 14 5th 1
您需要的基本转换由df.stack 提供,结果是:
0 UNIQUE ID 1
NAME John
AGE 10
DEP 4th
RANK 1
1 UNIQUE ID 2
NAME Priya
[...]
但是,您希望将列 UNIQUE ID 单独处理。这可以通过将其设为索引来完成:
>>> df.set_index('UNIQUE ID').stack()
UNIQUE ID
1 NAME John
AGE 10
DEP 4th
RANK 1
2 NAME Priya
AGE 11
DEP 4th
RANK 2
最后缺少的位是列名:您希望将它们重命名为数字。这可以通过两种不同的方式来实现:a) 通过重新分配 df.columns(首先将列 UNIQUE ID 移动到索引之后):
df = df.set_index('UNIQUE_ID')
df.columns = range(1, 5)
或 b) df.renaming 列:
df = df.set_index('UNIQUE_ID')
df = df.rename(columns={'NAME': 1, 'AGE': 2, 'DEP': 3, 'RANK': 4})
最后,您可以将生成的 Series 转换回 DataFrame。在正确位置获取COLUMN NO 的最优雅方法是在堆叠之前使用df.rename_axis。一起作为一个表达式(最好将其拆分):
>>> (df.set_index('UNIQUE ID')
.rename(columns={'NAME': 1, 'AGE': 2, 'DEP': 3, 'RANK': 4})
.rename_axis('COLUMN NO', axis=1)
.stack()
.to_frame('NAME')
.reset_index())
UNIQUE ID COLUMN NO NAME
0 1 1 John
1 1 2 10
2 1 3 4th
3 1 4 1
4 2 1 Priya
5 2 2 11
6 2 3 4th
7 2 4 2
8 3 1 Jack
9 3 2 15
10 3 3 5th
11 3 4 2
12 4 1 Jill
13 4 2 14
14 4 3 5th
15 4 4 1
遗漏的事情:读取数据;保留正确的类型:UNIQUE ID 看起来只是数字,但有可能要保留的前导零;所以将它们解析为字符串会更好。