目的
pythonで重いcsvファイルを読み込む時に、pandasだと時間がかかる。
そこで早いと噂のdaskを試してみる。
ここでは、daskの中身には詳しく触れず、使い方を説明する。
ちなみに、私が5GBのcsvファイルをdaskで読み込んだ時は、pandasを使用した時よりも10倍くらい早く読み込めた。
daskってなに?
daskとはpandasのようなライブラリの一つ。
daskは、pandasのDataFrameの処理を応用しているから、基本的にpandasと同じ動作をする。
早くなる理由は、並列分散を使用しているから。
詳しくはこちらの方の記事をご覧ください(めちゃわかりやすい)
使い方
anacondaをダウンロードした人なら基本的に何もせずに使える。
pandasならば、
import pandas as pd
pd.read_csv('test.csv')
と記述するところを、
import dask.dataframe as dd
dd.read_csv('test.csv').compute()
とするだけ。
pandasとの違いは.compute()とつける必要があること。これがないと実行されない。
後の結合や抽出といった処理もpandasのDataFrameと同様に処理できるし、早い。
エラーの対処法
基本的には、pandasの対処法と同じ。
- csvの中身に読み取れない日本語があるエラー
dd.read_csv('test.csv', encoding='sjis').compute()
encodingを試してみる。ダメなら'cp932'も試す。
- dtypeが違うエラー
daskはcsvファイルを読み込む際に、dtypeを始めの方の行で判断して読み込んでいるようで、途中で違うdtypeの文字が出てきたときにエラーがでる。
その時は、
dd.read_csv('test.csv', dtype={'カラム1':object,
'カラム2':float})
といったように、エラーが出た列のdtypeを指定してあげるといい。
daskでできないこと
- read_excelが使えない。
- 前回の記事で書いたエラーを無視して無理やり読み込むpandasの方法が使えない。
import codecs as cd
tmp = cd.open('test.csv', 'r', 'sjis', 'ignore')
pd.read_table(tmp)
理由は、dd.read_tableでは、上のコードのtmp部分(バッシュと呼ばれるデータの一時保管場所)を読み込めないから。pd.read_tableでは読み込めるようになっているのだが、まだdaskだと対応していないみたい。
まとめ
まだ、完全にはpandasと同じように使える訳ではないが、基本的な処理ならdaskでできる。
何より早く処理できるので、ストレスがなくなる!
参考
以上です。
これを書いて欲しい、役に立った等のご意見があると嬉しいです。
また、間違いがあればご指摘ください。