高效读写pandas数据帧

时间:2017-05-16 12:23:48

标签: python pandas dataframe sparse-matrix countvectorizer

我有一个pandas数据帧,我希望将它们分成几个100k行的小块,然后保存到磁盘上,以便我可以读取数据并逐个处理。我尝试使用dillhdf存储,因为csv和原始文本似乎需要花费很多时间。

我正在尝试使用~500k行和5列混合数据的数据子集。两个包含字符串,一个整数,一个浮点数,最后一个包含来自sklearn.feature_extraction.text.CountVectorizer的二元组计数,存储为scipy.sparse.csr.csr_matrix稀疏矩阵。

这是我遇到问题的最后一栏。转储和加载数据没有问题,但当我尝试实际访问数据时,它是一个pandas.Series对象。其次,该系列中的每一行都是一个包含整个数据集的元组。

# Before dumping, the original df has 100k rows.
# Each column has one value except for 'counts' which has 1400. 
# Meaning that df['counts'] give me a sparse matrix that is 100k x 1400. 

vectorizer = sklearn.feature_extraction.text.CountVectorizer(analyzer='char', ngram_range=(2,2))
counts = vectorizer.fit_transform(df['string_data'])
df['counts'] = counts

df_split  =  pandas.DataFrame(np.column_stack([df['string1'][0:100000],
                                               df['string2'][0:100000],
                                               df['float'][0:100000],
                                               df['integer'][0:100000],
                                               df['counts'][0:100000]]),
                                               columns=['string1','string2','float','integer','counts'])
dill.dump(df, open(file[i], 'w'))

df = dill.load(file[i])
print(type(df['counts'])
> <class 'pandas.core.series.Series'>
print(np.shape(df['counts'])
> (100000,)
print(np.shape(df['counts'][0])
> (496718, 1400)    # 496718 is the number of rows in my complete data set.
print(type(df['counts']))
> <type 'tuple'>

我是否犯了任何明显错误,或者是否有更好的方法以这种格式存储这些数据,这种方式不是很耗时?它必须可扩展到包含1亿行的完整数据。

1 个答案:

答案 0 :(得分:1)

df['counts'] = counts

这将产生一个Pandas系列(列),其元素数等于len(df),其中每个元素是一个稀疏矩阵,由vectorizer.fit_transform(df['string_data']) <返回/ p>

您可以尝试执行以下操作:

df = df.join(pd.DataFrame(counts.A, columns=vectorizer.get_feature_names(), index=df.index)

注意:请注意,这会将您的稀疏矩阵分解为密集(非稀疏)DataFrame,因此它将使用更多内存,您最终可以使用{ {1}}

<强>结论: 这就是为什么我建议您分别存储原始DF和MemoryError稀疏矩阵的原因