首页 > 解决方案 > 在 Python 中从大型数据帧创建稀疏矩阵

问题描述

我试图在回归中使用稀疏矩阵,因为在添加虚拟变量后有超过 40,000 个变量。为了做到这一点,我相信我需要为模型提供一个稀疏矩阵。但是,无法使用此处找到的代码将我的 pandas 数据框转换为矩阵:

直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵

这是因为数据集太大,我遇到了内存错误。这是我如何通过运行以下命令来复制问题的示例:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,40000,size=(1000000, 4)), columns=list('ABCD'))
df = pd.get_dummies(df,columns=['D'],sparse=True,drop_first=True)
df = df.values

我最终希望能够将数据框(49,000 列的 300 万条记录)转换为矩阵,因为我怀疑我可以创建一个稀疏矩阵并将其用于我的回归。这在较小的子集上效果很好,但我最终需要测试整个数据集。上面的示例立即产生“MemoryError”,所以我怀疑这是 Python 的一些限制,但我希望有一个解决方法。

标签: pythonout-of-memorylinear-regressionsparse-matrix

解决方案


你可以这样做:

import numpy as np
import pandas as pd
import scipy.sparse

N = 40000
M = 1000000
df = pd.DataFrame(np.random.randint(0, N, size=(M, 4)), columns=list('ABCD'))
v = df['D'].values
sp = scipy.sparse.coo_matrix((np.ones_like(v), (np.arange(len(v)), v)), shape=[len(v), N])
print(sp.shape)
# (1000000, 40000)
print(sp.getnnz())
# 1000000

推荐阅读