HOWTO · Pandas

Parquet ファイルを Pandas DataFrame に読み込む

このチュートリアルでは、Python で Parquet ファイルを pandas DataFrame に読み込む方法を示します。

このページの内容

Parquet ファイルを pandas DataFrame に読み込むには、pandas と互換性のある Parquet エンジンをインストールし、pandas.read_parquet() を呼び出します。以下の例では PyArrow を使用し、小さな DataFrame を一時ファイルに書き込んで読み戻します。

Parquet ファイル

Parquet は表形式データ向けの列指向ファイル形式です。値を列ごとに格納し、スキーマや圧縮の情報を含めることができるため、分析用データセットによく使われます。CSV はテキストベースの行形式です。両形式にはそれぞれ異なるトレードオフがあり、どちらかが普遍的に高速または効率的というわけではありません。読み取るデータ量と選択したエンジンによって、データセットの読み込みにかかる処理は変わります。

Parquet はテーブルなどの構造化データを対象としており、動画、音声、画像ファイルの汎用コンテナを目的としたものではありません。Parquet ファイルには、別の場所に保存されたメディアを参照する値を持つ列を含めることができますが、メディア自体はこの表形式の目的ではありません。

Parquet ファイルを Pandas DataFrame に読み込む

プログラムを実行する Python 環境に、python -m pip install pandas pyarrow で pandas と PyArrow をインストールしてください。pandas がファイルを処理するには、サポートされた Parquet エンジンが必要です。この例では PyArrow を明示的に選択しています。エンジンはインストールされている必要があり、利用できるオプションは pandas 環境によって異なる場合があります。pandas でよく使われるもう 1 つのエンジンは fastparquet です。環境に合う場合にのみインストールして選択してください。

すでにファイルがある場合は pd.read_parquet(path, engine="pyarrow") を使用します。path はローカルファイルまたはサポートされたリモートソースを指定できます。この関数は pandas DataFrame を返します。既存のデータセットについては、選択したエンジンとソースがその操作をサポートしている場合、columns=[...] を設定して特定の列を要求できます。関数の完全なシグネチャと受け付けるオプションは pandas のバージョンとエンジンによって異なる場合があるため、追加の引数に頼る前に、プロジェクトにインストールされているバージョンのドキュメントを確認してください。

ローカルファイルの場合、相対パスはプログラムの現在の作業ディレクトリから解決されます。スクリプトが異なるディレクトリから実行される可能性がある場合は、絶対パスを使用してください。リモートストアから読み取る場合、ソースは選択したエンジンでサポートされている必要があり、必要な資格情報やストレージ設定がプロセスから利用できる必要があります。返される DataFrame には、ファイルからデコードされた列と行が含まれ、データ型は保存されたスキーマとリーダーがサポートする型マッピングから決定されます。後の分析で値に別の pandas 型が必要な場合は、読み込み後にその列を変換してください。

次の例では、ローカルの Parquet 往復処理を試みる前に PyArrow があるかどうかを確認します。サンプルの DataFrame は常に出力されます。PyArrow がインストールされている場合は、一時 Parquet ファイルへの書き込みと読み込みも行います。完全な往復処理を実行するには、アクティブな環境に pandas と PyArrow をインストールしてください。

from importlib.util import find_spec
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd

students = pd.DataFrame(
    {
        "student": ["Alia", "Zoya", "Ali"],
        "marks": [20, 10, 22],
    }
)

if find_spec("pyarrow") is None:
    print("PyArrow is not installed; displaying the sample DataFrame only.")
    print(students.to_string(index=False))
else:
    with TemporaryDirectory() as directory:
        parquet_path = Path(directory) / "students.parquet"
        students.to_parquet(parquet_path, engine="pyarrow", index=False)
        loaded = pd.read_parquet(parquet_path, engine="pyarrow")
        print(loaded.to_string(index=False))

この例を確認するために使用した環境では PyArrow を利用できないため、コードはその制限を報告し、Parquet ファイルを読み込んだと主張する代わりに、メモリ上のサンプルを表示します。PyArrow をインストールすれば、同じコードで往復処理が実行され、読み込まれた行が表示されます。

PyArrow is not installed; displaying the sample DataFrame only.
student  marks
   Alia     20
   Zoya     10
    Ali     22

プロジェクト内のファイルについては、parquet_path をそのパスに置き換え、エンジンは環境にインストールされているパッケージと一致させてください。インストールされているエンジンが異なる場合は、read_parquet() でそのエンジンを選択し、サポートされているオプションを確認してください。読み込み後は、分析を続ける前に、loaded.head() で素早くプレビューするか、loaded.dtypes で推論された列の型を確認してください。