Python Pandas:将2,000,000个DataFrame行转换为二进制矩阵(pd.get_dummies())而没有内存错误?

jfi*_*ive 9 python performance numpy bigdata pandas

我正在处理一个包含2,000,000行的大型记录文件.每行包含有关电子邮件的功能和[0,1]分别用于非垃圾邮件或垃圾邮件的二进制标签.

我想转换的所有功能,如email_type这需要对值从[1,10]二进制矩阵.

这可以使用pd.get_dummies(),从一列特征创建二进制矩阵来完成.

这完全适用于数据的一个小子样本,比如10,000行.但是,对于100,000+行,我看到错误Killed:9.

为解决这个问题,我尝试了以下方法:

脚步:

  1. 使用将DataFrame拆分为10,000行的块 numpyp.array_split()
  2. 为10,000行的每个DataFrame创建二进制矩阵
  3. 将它们附加到DataFrame列表中
  4. 将这些DataFrame连接在一起(我这样做是为了保留每个块将包含的列的差异)

码:

# break into chunks
chunks = (len(df) / 10000) + 1
df_list = np.array_split(df, chunks)
super_x = []
super_y = []

# loop through chunks
for i, df_chunk in enumerate(df_list):
    # preprocess_data() returns x,y (both DataFrames)
    [x, y] = preprocess_data(df_chunk)
    super_x.append(x)
    super_y.append(y)

# vertically concatenate DataFrames
super_x_mat = pd.concat(super_x, axis=0).fillna(0)
super_y_mat = pd.concat(super_y, axis=0)

# pickle (in case of further preprocessing)
super_x_mat.to_pickle('super_x_mat.p')
super_y_mat.to_pickle('super_y_mat.p')

# return values as np.ndarray
x = super_x_mat.values
y = super_y_mat.values
return[x, y]
Run Code Online (Sandbox Code Playgroud)

一些示例输出:

chunks 13
chunk 0 2016-04-08 12:46:55.473963
chunk 1 2016-04-08 12:47:05.942743
...
chunk 12 2016-04-08 12:49:16.318680
Killed: 9
Run Code Online (Sandbox Code Playgroud)

在处理32块(320,000行)之后,步骤2(转换为二进制矩阵)是内存不足,但是当块被附加到数据帧列表时,可能发生内存不足,如下所示df_chunks.append(df).

尝试连接20成功处理的块(200,000行)时,步骤3内存不足

理想的输出是numpy.ndarray我可以提供给sklearnLogistic回归分类器.

我可以尝试其他什么方法?我开始更频繁地在这个大小的数据集上进行机器学习.

我是在接受建议并接受以下建议:

  1. 使用整个数据帧中的所有可能列处理每个块,并在重新组合之前保存为文件
  2. 建议文件数据存储
  3. 完全使用不同矩阵的其他方法

ntg*_*ntg 6

如果您正在执行类似热门编码的操作,或者在任何情况下都会有大量的零,您是否考虑过使用稀疏矩阵?这应该在预处理之后完成,例如:

[x, y] = preprocess_data(df_chunk)
x = sparse.csr_matrix(x.values)
super_x.append(x)
Run Code Online (Sandbox Code Playgroud)

熊猫也有稀疏类型:

x=x.to_sparse()
[x, y] = preprocess_data(df_chunk)
super_x.append(x)
Run Code Online (Sandbox Code Playgroud)

一个注意事项:由于您正在按行切割和连接,因此csr优于csc.