2017-05-16 12 views
1

私は100k行の複数の小さなピースに分割してディスクに保存したいので、データを読み込んで1つずつ処理することができます。私はdillhdfのストレージを使用しようとしました.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億行を含む私の完全なデータにスケーラブルでなければなりません。

+0

あなたはどのように作成した/追加'counts'カラム? – MaxU

+0

コードにこれを追加しました – Tobias

+1

疎な行列をpandas列として格納するのは良い考えではありません.IMOはエラーが発生しやすい方法です。私はそれらを別々に保管しています... – MaxU

答えて

1
df['counts'] = counts 

これは​​と各要素に等しい要素の#でパンダシリーズ(列)を生成しますvectorizer.fit_transform(df['string_data'])

によって返されるスパース行列は、あなたがやろうとすることができるさ次

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

注:は注意して、これはデータフレーム(スパースではない)densedにあなたの疎行列を爆発するので、それがしますはるかのメモリを使用すると、あなたはMemoryError

結論で終わることができます。私はあなたの元DFを保存するためにあなたをお勧めしたい理由です とcount疎行列別途

+0

ありがとう、本当にサイズが爆発しました。私はあなたが示唆したように2つを分けます。 – Tobias

+0

@Tobias、うれしかった:) – MaxU

関連する問題