我有一个pandas数据框架,其中包括学生每学期所修的课程。
data = [['1011', 10, 'Spring-2022','MATH-101'],
['1011', 11, 'Summer-2022','BIO-101'],
['1011', 12, 'Fall-2022','STAT-102'],
['1011', 12, 'Fall-2022','CHEM-101'],
['1022', 10, 'Spring-2022','ART-101'],
['1022', 10, 'Spring-2022','HIST-102'],
['1022', 12, 'Fall-2022','MATH-101'],
]
df = pd.DataFrame(data, columns=['StudentID', 'TermID', 'Termname','CourseID'])
print(df)
StudentID TermID Termname CourseID
0 1011 10 Spring-2022 MATH-101
1 1011 11 Summer-2022 BIO-101
2 1011 12 Fall-2022 STAT-102
3 1011 12 Fall-2022 CHEM-101
4 1022 10 Spring-2022 ART-101
5 1022 10 Spring-2022 HIST-102
6 1022 12 Fall-2022 MATH-101
我试图将其转换为3D numpy数组,其中numpy数组的形状是(没有唯一的学生,没有唯一的术语,没有唯一的课程)。例如,形状为(2,3,6)。
numpy数组的第二维和第三维是一个2D独热编码矩阵,其中行表示所有术语,列表示所有课程。
最终输出:
arr = np.zeros((2,3,6))
arr[0,0,0]=1 #student 1011 Term 10 Course MATH-101
arr[0,1,1]=1 #student 1011 Term 11 Course BIO-101
arr[0,2,2]=1 #student 1011 Term 12 Course STAT-102
arr[0,2,3]=1 #student 1011 Term 12 Course CHEM-101
arr[1,0,4]=1 #student 1022 Term 10 Course ART-101
arr[1,0,5]=1 #student 1022 Term 10 Course HIST-102
arr[1,2,0]=1 #student 1022 Term 12 Course MATH-101
print(arr)
[[[1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0.]
[0. 0. 1. 1. 0. 0.]]
[[0. 0. 0. 0. 1. 1.]
[0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0.]]]
2条答案
按热度按时间mcvgt66p1#
你可以在使用
pd.factorize
之后使用numpy
(或者scipy
来创建稀疏矩阵):输出量:
avkwfej42#
使用
crosstab
和stack
,然后reshape
:输出量:
如果需要列的特定顺序,请使用分类或重新排序,并带有:
输出量: