LoginSignup
45
51

More than 5 years have passed since last update.

遅いpandasのread_csvを高速化する方法(dask)

Last updated at Posted at 2019-02-12

目的

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でできる。
何より早く処理できるので、ストレスがなくなる!

参考

以上です。
これを書いて欲しい、役に立った等のご意見があると嬉しいです。
また、間違いがあればご指摘ください。

45
51
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
51