Pandas df.to_parquet() 関数
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, ...)
パラメータの説明
| パラメータ | 型 | 説明 | デフォルト値 |
|---|---|---|---|
| path | str, path object | ファイルパス | 必須 |
| engine | str | エンジン:'auto', 'pyarrow', 'fastparquet' | 'auto' |
| compression | str | 圧縮方式:'snappy', 'gzip', 'brotli', None | 'snappy' |
| index | bool, None | インデックスを含めるかどうか | None |
| partition_cols | list | パーティション列。列ごとにパーティション保存します | 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)
# サンプル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
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}')
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'))
# インデックス付き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 よく使う関数