我正在尝试从Pandas数据集(>10Gb)中创建一个稀疏矩阵。
假设我有一个如下类型的数据集:
表:Class
student |teacher
---------------------
0 | abc | a
1 | def | g
我有一份学生名单。
students = [ "abc", "def", "ghi", "jkl","mno"]
以及教师列表
teachers = ["a","b","c","d","e","f","g"]
我的目标是创建一个稀疏矩阵,如果表格Class中存在学生-教师对应关系,则矩阵中应该有一个布尔值1。
密集矩阵应该长这样:
a b c d e f g
abc 1 0 0 0 0 0 0
def 0 0 0 0 0 0 1
ghi 0 0 0 0 0 0 0
jkl 0 0 0 0 0 0 0
mno 0 0 0 0 0 0 0
现在我的真实数据集中有70万个学生和10万个教师的数据。
最初,我尝试构建一个简单的密集矩阵,然后使用scipy将其转换为稀疏矩阵。然而,700k * 100k字节=约70GB,正如您所意识到的那样,这并不起作用。
因此,我尝试为学生和教师分配唯一值,然后将这些值附加到行和列,并尝试以坐标格式创建稀疏矩阵。
代码:
# Get unique value for each student and teacher
dictstudent = {}
count = 0
for i in rows:
dictstudent[i] = count
count +=1
dictteacher ={}
count = 0
for i in cols:
dictteacher[i] = count
count +=1
现在每位老师和学生都有一个与之关联的数字编号。如果学生出现在课程表中,请存储其数字值,如果教师出现在“r”和“c”表中,请存储其数字值。
r = []
c = []
for row,col in zip(student,teacher):
r.append(dictstudent[row])
c.append(dictteacher[col])
values = [1] * class["student"].size #From the pandas dataframe class
然后加载它以创建一个稀疏矩阵。
a = sparse.coo_matrix((values,(r,c)),shape=(len(students),len(teachers)))
这个方法对我的小测试数据集来说效果很好。但是对于我的实际大数据集,它崩溃了。
有更好的方法可以解决这个问题吗?