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