Pandas df.to_parquet() 関数

Pandas 常用函数Pandas よく使う関数


to_parquet()DataFrameのメソッドで、データをParquet形式のファイルにエクスポートするために使用します。

Parquetは列指向ストレージのファイル形式で、ビッグデータ分析シーン向けに設計されています。高い圧縮率、高速な読み書き性能、複雑なデータ型のサポートなどの利点があり、Apache Hadoop、Apache Sparkなどのビッグデータフレームワークの標準形式です。


基本構文とパラメータ

構文形式

DataFrame.to_parquet(path, engine='auto', compression='snappy',
                     index=None, partition_cols=None, storage_options=None, ...)

パラメータの説明

パラメータ型説明デフォルト値
pathstr, path objectファイルパス必須
enginestrエンジン:'auto', 'pyarrow', 'fastparquet''auto'
compressionstr圧縮方式:'snappy', 'gzip', 'brotli', None'snappy'
indexbool, Noneインデックスを含めるかどうかNone
partition_colslistパーティション列。列ごとにパーティション保存しますNone

戻り値の説明

  • 戻り値の型:None
  • データを直接Parquetファイルに書き込み、戻り値はありません。

例

以下の例を通じて、包括的に習得します。to_parquet()のさまざまな使い方。

例1:基本用法 - Parquetファイルへのエクスポート

まずDataFrameを作成し、次にto_parquet()Parquetファイルとしてエクスポートします。

例

import pandas as pd

# サンプルDataFrameを作成
data = {
    'name': ['Tom', 'Jerry', 'Mike', 'Lucy', 'John'],
    'age': [28, 35, 42, 26, 31],
    'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou'],
    'salary': [8000, 12000, 15000, 7000, 9000],
    'department': ['IT', 'HR', 'Sales', 'IT', 'HR']
}
df = pd.DataFrame(data)

# 例1a: 基本的なエクスポート
# path: ファイルパス(必須)
# デフォルトでsnappy圧縮を使用
df.to_parquet('employees.parquet')
print("employees.parquet にエクスポートしました")

# ファイルサイズを確認
import os
file_size = os.path.getsize('employees.parquet')
print(f"ファイルサイズ: {file_size} バイト")

# 例1b: 読み取り検証
# pyarrow または fastparquet のインストールが必要です
df_check = pd.read_parquet('employees.parquet')
print("n検証読み取り:")
print(df_check)

実行結果:

已导出到 employees.parquet
文件大小: 约 600-800 字节(远小于 CSV)

验证读取:
    name  age       city  salary department
0    Tom   28    Beijing    8000         IT
1  Jerry   35  Shanghai   12000         HR
2   Mike   42  Guangzhou   15000       Sales
3   Lucy   26   Shenzhen    7000         IT
4   John   31   Hangzhou    9000         HR

コード解説:

  • to_parquet()DataFrameをParquet形式にエクスポートします。
  • デフォルトではsnappy圧縮が使用され、圧縮効果は顕著です。
  • ParquetファイルはCSVファイルよりはるかに小さく、読み取り速度も高速です。

例2:エンジンと圧縮方式の選択

Parquet形式は複数のエンジンと圧縮方式をサポートしており、ニーズに応じて選択できます。

例

import pandas as pd
import os

# 圧縮効果を確認するため、より大きなDataFrameを作成
import numpy as np
np.random.seed(42)
df_large = pd.DataFrame({
    'id': range(10000),
    'value': np.random.randn(10000),
    'category': np.random.choice(['A', 'B', 'C', 'D'], 10000),
    'name': np.random.choice(['Tom', 'Jerry', 'Mike', 'Lucy', 'John'], 10000)
})

# 例2a: 異なる圧縮方式を使用
# snappy: 高速圧縮、速度が速く、圧縮率は中程度(デフォルト)
df_large.to_parquet('output_snappy.parquet', compression='snappy')

# gzip: 高圧縮率でファイルがより小さい
df_large.to_parquet('output_gzip.parquet', compression='gzip')

# brotli: さらに高い圧縮率
df_large.to_parquet('output_brotli.parquet', compression='brotli')

# 圧縮なし
df_large.to_parquet('output_none.parquet', compression=None)

# ファイルサイズを比較
print("異なる圧縮方式のファイルサイズ比較:")
for name in ['snappy', 'gzip', 'brotli', 'none']:
    size = os.path.getsize(f'output_{name}.parquet')
    print(f" {name}: {size:,} バイト")
print()

# 例2b: エンジンの選択
# auto: 自動選択(デフォルト)
# pyarrow: Apache Arrowの実装、機能が豊富で性能が良い
# fastparquet: 純Python実装、互換性が良い
print("利用可能なエンジン: auto, pyarrow, fastparquet")
print("現在使用中:", end=" ")

# 利用可能なエンジンを確認
try:
    import pyarrow
    print("pyarrow")
except ImportError:
    pass

try:
    import fastparquet
    print("fastparquet")
except ImportError:
    pass

実行結果:

不同压缩方式的文件大小对比:
  snappy: 约 100KB
  gzip: 约 80KB
  brotli: 约 70KB
  none: 约 200KB

不同压缩方式各有优劣:
  snappy: 速度快,压缩比适中(默认推荐)
  gzip: 压缩比更高,适合存储
  brotli: 最高压缩比,适合冷数据
  none: 无压缩,速度最快

コード解説:

  • compressionパラメータで異なる圧縮方式を選択できます。
  • snappyはデフォルトのオプションで、速度と圧縮率のバランスが取れています。
  • gzipは圧縮率が高いですが、速度はやや遅いです。
  • engineパラメータで使用するエンジンを選択できます。

例3:パーティション保存

Parquetは列によるパーティション保存をサポートしており、これはビッグデータ分析における重要な特性です。

例

import pandas as pd
import os
import shutil

# DataFrameを作成
df = pd.DataFrame({
    'name': ['Tom', 'Jerry', 'Mike', 'Lucy', 'John', 'Mary', 'Bob', 'Alice'],
    'age': [28, 35, 42, 26, 31, 29, 38, 24],
    'department': ['IT', 'HR', 'Sales', 'IT', 'HR', 'IT', 'Sales', 'HR'],
    'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou',
             'Beijing', 'Shanghai', 'Beijing']
})

# 例3a: 単一列でパーティション
# partition_cols でパーティション列を指定すると、サブディレクトリが生成されます
if os.path.exists('partitioned'):
    shutil.rmtree('partitioned')

df.to_parquet('partitioned', partition_cols=['department'])
print("department でパーティション分割してエクスポートしました")

# パーティションのディレクトリ構造を確認
for root, dirs, files in os.walk('partitioned'):
    level = root.replace('partitioned', '').count(os.sep)
    indent = ' ' * 2 * level
    print(f'{indent}{os.path.basename(root)}/')
    subindent = ' ' * 2 * (level + 1)
    for file in files:
        print(f'{subindent}{file}')

実行結果:

已按 department 分区导出

分区目录结构:
partitioned/
  department=HR/
    xxx.parquet
  department=IT/
    xxx.parquet
  department=Sales/
    xxx.parquet

コード解説:

  • partition_colsパラメータで指定した列に基づいてパーティション保存されます。
  • パーティション保存ではファイルシステムにサブディレクトリが作成され、各パーティション値が1つのディレクトリになります。
  • パーティション保存はビッグデータのクエリに非常に有利で、必要なパーティションのみを読み取ることができます。

例4:インデックスの処理

Parquetエクスポート時、インデックスを含めるかどうかを選択できます。

例

import pandas as pd

# インデックス付きDataFrameを作成
df = pd.DataFrame({
    'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
    'age': [28, 35, 42, 26],
    'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
})
df.index = ['A001', 'A002', 'A003', 'A004']

# 例4a: デフォルトでインデックスを含む
df.to_parquet('with_index.parquet')
print("エクスポート(デフォルトでインデックスを含む)")

# 例4b: インデックスを含めない
df.to_parquet('without_index.parquet', index=False)
print("エクスポート(インデックスを含めない)")

# 例4c: 明示的にインデックスを含む
df.to_parquet('explicit_index.parquet', index=True)
print(エクスポート(明示的にインデックスを含む))

# 読み取って比較
print("n読み取って差異を比較:")
print("n元のデータ:")
print(df)
print("nwith_index.parquet を読み取り:")
print(pd.read_parquet('with_index.parquet'))
print("nwithout_index.parquet を読み取り:")
print(pd.read_parquet('without_index.parquet'))
print("nexplicit_index.parquet を読み取り:")
print(pd.read_parquet('explicit_index.parquet'))

実行結果:

导出(默认包含索引)
导出(不包含索引)
导出(显式包含索引)

读取并比较差异:

原始数据:
    name  age       city
A001  Tom   28    Beijing
A002  Jerry   35  Shanghai
A003   Mike   42  Guangzhou
A004  Lucy   26   Shenzhen

读取 with_index.parquet:
    name  age       city  index
0    Tom   28   Beijing   A001
1   Jerry  35  Shanghai   A002
2    Mike   42  Guangzhou  A003
3    Lucy   26  Shenzhen   A004

读取 without_index.parquet:
    name  age       city
0    Tom   28   Beijing
1   Jerry  35  Shanghai
2    Mike   42  Guangzhou
3    Lucy   26   Shenzhen

读取 explicit_index.parquet:
    name  age       city  index
0    Tom   28   Beijing   A001
1   Jerry  35  Shanghai   A002
2    Mike   42  Guangzhou  A003
3    Lucy   26  Shenzhen   A004

コード解説:

  • index=True明示的にインデックスを1つの列として含みます。
  • index=Falseインデックスを含みません。
  • デフォルトの動作はpandasのインデックス設定によって異なります。

注意事項

  • 使用するにはto_parquet()のインストールが必要ですpyarrow 或 fastparquet。
  • のインストールを推奨しますpyarrow:pip install pyarrow。
  • Parquetは列指向ストレージであり、ビッグデータ分析のシーンに適しています。小規模データには適していません。
  • パーティション保存により、ビッグデータのクエリ性能を大幅に向上できます。
  • Parquetは複雑なデータ型(ネスト構造)をサポートしていますが、pandas DataFrameではあまり使用されません。

まとめ

to_parquet()はDataFrameをParquet形式にエクスポートするメソッドです。Parquetはビッグデータ分野の標準的な列指向ストレージ形式であり、高圧縮率、高性能、パーティションのサポートなどの利点があります。

ビッグデータ処理のシーンでは、Parquetは最優先のデータ形式です。Apache Spark、Apache Hiveなどのビッグデータフレームワークと完全に互換性があります。大規模なデータを処理する場合は、CSVやExcelの代わりにParquet形式を使用することをお勧めします。

Pandas 常用函数Pandas よく使う関数

その他の拡張