pandas と Parquet で高速にデータを保存・読み込みする

CSV はテキストベースのフォーマットなので、ファイルサイズが大きくなりがちで、読み書きの速度も遅くなります。Parquet(パーケット)は列指向のバイナリ形式で、圧縮効率と読み込み速度に優れたフォーマットです。pandas は Parquet の読み書きを標準でサポートしています。

Parquet で保存する

DataFrame を Parquet 形式で保存するには to_parquet を使います。

import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie"] * 10000,
    "age": [25, 30, 35] * 10000,
    "score": [88.5, 92.0, 76.3] * 10000
})

df.to_parquet("data.parquet")

Parquet はデフォルトで snappy 圧縮が適用されるため、CSV と比べてファイルサイズが大幅に小さくなります。同じデータを CSV で保存した場合と比較すると、サイズが数分の一になることも珍しくありません。

Parquet を読み込む

読み込みは read_parquet を使います。

df = pd.read_parquet("data.parquet")
print(df.shape)

CSV と異なり、列の型情報がファイルに埋め込まれているため、読み込み後に型変換を行う必要がありません。int は int、float は float、文字列は文字列としてそのまま復元されます。

CSV

テキスト形式で人間が読める。型情報を持たないため、読み込み時に型推定が必要

Parquet

バイナリ形式で高速・コンパクト。型情報を保持するため、読み込み時に型のずれが起きない

特定の列だけ読み込む

Parquet は列指向フォーマットなので、特定の列だけを効率的に読み込めます。

df = pd.read_parquet("data.parquet", columns=["name", "score"])

CSV では全列を読み込んでからフィルタリングする必要がありますが、Parquet なら不要な列はディスクから読み出されません。列数が多いデータほど効果が大きくなります。

エンジンの選択

pandas は pyarrow と fastparquet の 2 つのエンジンをサポートしています。

pyarrow高速で多機能。デフォルトのエンジン
fastparquet軽量で依存が少ない
df.to_parquet("data.parquet", engine="pyarrow")
df = pd.read_parquet("data.parquet", engine="pyarrow")

特にこだわりがなければ pyarrow を使っておけば問題ありません。pip install pyarrow でインストールできます。

圧縮方式を変える

デフォルトの snappy 圧縮のほか、gzip や brotli なども選べます。

df.to_parquet("data_gzip.parquet", compression="gzip")
df.to_parquet("data_none.parquet", compression=None)

gzip は snappy よりも圧縮率が高いかわりに、圧縮・展開に時間がかかります。読み書きの速度を優先するなら snappy、ファイルサイズを最小にしたいなら gzip が適しています。

データの分析ワークフローにおいて、CSV は外部とのやり取りに使い、中間データや内部保存には Parquet を使うという使い分けがおすすめです。特に繰り返し読み込むデータは Parquet に変換しておくだけで、作業効率が大きく向上します。