はじめに
pandas.read_csv に関して、高速化・日本語対応等に関するノウハウをまとめました。
圧縮CSVファイルの読み込み
compression="infer" # デフォルト値
- Pandas.read_csvは、gzip, zipなどで圧縮されたCSVファイルをOn-the-flyで解凍して読み込める。
- デフォルトでは「compression="infer"」のため、read_csvは拡張子から圧縮方法を推定する。compressionを変更することで、拡張子によらない圧縮方法の指定が可能。
- 冗長になりがちなCSVファイルは圧縮率が高いため、これを利用するとディスク領域の削減効果が高い。
日本語CSVファイルの読み込み
engine = "python"
- デフォルトのparserエンジン"c"では日本語名ファイルの読み込みに失敗する。
- parserエンジン"python"を指定すると、日本語ファイルの読み込みも可能になる。
- ただし、parserエンジン"c"の方が高速。
複数カラムを日付カラムに変換
parse_dates = {"DATETIME":["DATE","TIME"]}
- 日付カラム"DATE"と時刻カラム"TIME"を連結して"DATETIME"という新しい日時カラムを定義できる。
日付フォーマットを指定して高速化
to_datetime = lambda d: pd.to_datetime(d, format ="%Y/%m/%d %H:%M:%S")
...
date_parser = to_datetime
日付フォーマットは指定したほうが、read_csvの読み込みが高速化される。
Windows環境では文字コードは”CP932”
encoding = "cp932"
- Windows環境のShift-JIS = Shift-JISを拡張したCP932 ≠ Pythonの Shift-JIS
- そのため、文字コードとして”sjis”を使うならば”cp932"を指定したほうがトラブルが少ない。
pickleで入出力を高速化
df.to_pickle("D:¥¥Output.pkl")
- pickle形式はCSV形式と比べ、型推定などを省略できるため、読み込みが高速。
- そのため、前処理後のデータはCSV形式でなくPickle形式で保存したほうが良い。
サンプルコード
sample.py
import pandas as pd
# 日付フォーマットを指定して高速化
to_datetime = lambda d: pd.to_datetime(d, format ="%Y/%m/%d %H:%M:%S", errors="coerce")
df = pd.read_csv(
"D:¥¥日本語.csv.gz", # 圧縮CSVファイルの読み込み
parse_dates = {"DATETIME":["DATE","TIME"]}, # 複数カラムを日付カラムに変換
date_parser = to_datetime, # 日付フォーマットを指定して高速化
engine = "python", # 日本語CSVファイルの読み込み
encoding = "cp932", # Windows環境では文字コードは”CP932”
)
# pickleで入出力を高速化
df.to_pickle("D:¥¥Output.pkl")
df2 = pd.read_pickle("D:¥¥Output.pkl")