私は100k行の複数の小さなピースに分割してディスクに保存したいので、データを読み込んで1つずつ処理することができます。私はdill
とhdf
のストレージを使用しようとしました.csvと生のテキストは時間がかかるようです。パンダデータフレームの効率的な読み取りと書き込み
私はこれを〜500k行と5列の混合データのデータのサブセットで試しています。 2つは文字列、1つの整数、1つの浮動小数点数を含み、最後はsklearn.feature_extraction.text.CountVectorizer
のバイグラム数を含み、scipy.sparse.csr.csr_matrix
スパース行列として格納されます。
私が問題を抱えているのは最後の列です。データのダンプとロードは問題ありませんが、実際にデータにアクセスしようとすると、代わりにpandas.Seriesオブジェクトになります。第2に、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億行を含む私の完全なデータにスケーラブルでなければなりません。
あなたはどのように作成した/追加'counts'カラム? – MaxU
コードにこれを追加しました – Tobias
疎な行列をpandas列として格納するのは良い考えではありません.IMOはエラーが発生しやすい方法です。私はそれらを別々に保管しています... – MaxU