我们可以使用 Unique ID 将数据分离成以下格式吗?

Can we separate data using Unique ID in to the following format?

当前格式:

UNIQUE ID NAME AGE DEP RANK
001 John 10 4th 1
002 Priya 11 4th 2
003 Jack 15 5th 2
004 Jill 14 5th 1

预期格式:

UNIQUE ID NAME COLUMN_NO
001 John 1
001 10 2
001 4th 3
001 1 4
002 Priya 1
002 11 2
002 4th 3
002 2 4

我的起点:

>>> 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.renam 列:

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 看起来只是数字,但有可能想要保留的前导零;所以将它们解析为字符串会更好。