Pandas df.to_parquet()-Funktion
to_parquet()Es ist eine Methode von DataFrame, mit der Daten in eine Datei im Parquet-Format exportiert werden.
Parquet ist ein spaltenorientiertes Speicherdateiformat, das speziell für Big-Data-Analyseszenarien entwickelt wurde. Es bietet Vorteile wie hohe Kompressionsrate, hohe Lese-/Schreibleistung und Unterstützung komplexer Datentypen. Es ist das Standardformat für Big-Data-Frameworks wie Apache Hadoop und Apache Spark.
Grundlegende Syntax und Parameter
Syntaxformat
DataFrame.to_parquet(path, engine='auto', compression='snappy',
index=None, partition_cols=None, storage_options=None, ...)
Parameterbeschreibung
| Parameter | Type | Beschreibung | Standardwert |
|---|---|---|---|
| path | str, Pfadobjekt | Dateipfad | Erforderlich |
| engine | str | Engine: 'auto', 'pyarrow', 'fastparquet' | 'auto' |
| compression | str | Komprimierung: 'snappy', 'gzip', 'brotli', None | 'snappy' |
| index | bool, None | Gibt an, ob der Index einbezogen werden soll | Keine |
| partition_cols | Liste | Partitionsspalte(n), Daten partitioniert nach Spalte speichern | Keine |
Beschreibung des Rückgabewerts
- Rückgabetyp:
None - Schreibt Daten direkt in eine Parquet-Datei, kein Rückgabewert.
Beispiele
Anhand der folgenden Beispiele meistern Sie umfassendto_parquet()die verschiedenen Verwendungsweisen.
Beispiel 1: Grundlegende Verwendung - Export in eine Parquet-Datei
Erstellen Sie zuerst ein DataFrame und verwenden Sie dannto_parquet()in eine Parquet-Datei zu exportieren.
Beispiel
# Beispiel-DataFrame erstellen
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)
# Beispiel 1a: Grundlegender Export
# path: Dateipfad (erforderlich)
# Verwendet standardmäßig Snappy-Komprimierung
df.to_parquet('employees.parquet')
print("Exportiert nach employees.parquet")
# Dateigröße prüfen
import os
file_size = os.path.getsize('employees.parquet')
print(f"Dateigröße: {file_size} bytes")
# Beispiel 1b: Lesen und überprüfen
# Erfordert die Installation von pyarrow oder fastparquet
df_check = pd.read_parquet('employees.parquet')
print("nDurch Lesen überprüfen:")
print(df_check)
Ausgabe:
已导出到 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
Code-Erklärung:
to_parquet()Exportieren Sie das DataFrame in das Parquet-Format.- Standardmäßig wird
snappyKomprimierung, mit bemerkenswerten Komprimierungsergebnissen. - Parquet-Dateien sind viel kleiner als CSV-Dateien und auch schneller zu lesen.
Beispiel 2: Auswahl von Engine und Komprimierungsmethode
Das Parquet-Format unterstützt mehrere Engines und Komprimierungsmethoden, die nach Bedarf ausgewählt werden können.
Beispiel
import os
# Erstelle ein größeres DataFrame, um den Komprimierungseffekt zu beobachten.
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)
})
# Beispiel 2a: Verschiedene Kompressionsmethoden verwenden
# snappy: schnelle Kompression, hohe Geschwindigkeit, mäßige Kompressionsrate (Standard)
df_large.to_parquet('output_snappy.parquet', compression='snappy')
# gzip: hohe Kompressionsrate, kleinere Dateien
df_large.to_parquet('output_gzip.parquet', compression='gzip')
# brotli: höhere Kompressionsrate
df_large.to_parquet('output_brotli.parquet', compression='brotli')
# keine Kompression
df_large.to_parquet('output_none.parquet', compression=None)
# Dateigrößen vergleichen
print("Vergleich der Dateigrößen mit verschiedenen Komprimierungsmethoden:")
for name in ['snappy', 'gzip', 'brotli', 'none']:
size = os.path.getsize(f'output_{name}.parquet')
print(f" {name}: {size:,} bytes")
print()
# Beispiel 2b: Engine auswählen
# auto: automatische Auswahl (Standard)
# pyarrow: Apache-Arrow-Implementierung, voll funktionsfähig, gute Leistung
# fastparquet: reine Python-Implementierung, gute Kompatibilität
print("Verfügbare Engines: auto, pyarrow, fastparquet")
print("Derzeit verwendet:", end=" ")
# Verfügbare Engines prüfen
try:
import pyarrow
print("pyarrow")
except ImportError:
pass
try:
import fastparquet
print("fastparquet")
except ImportError:
pass
Ausgabe:
不同压缩方式的文件大小对比: snappy: 约 100KB gzip: 约 80KB brotli: 约 70KB none: 约 200KB 不同压缩方式各有优劣: snappy: 速度快,压缩比适中(默认推荐) gzip: 压缩比更高,适合存储 brotli: 最高压缩比,适合冷数据 none: 无压缩,速度最快
Code-Erklärung:
compressionDer Parameter compression ermöglicht die Auswahl verschiedener Kompressionsmethoden.snappyist die Standardoption und gleicht Geschwindigkeit und Kompressionsrate aus.gzipHat eine höhere Kompressionsrate, ist aber etwas langsamer.engineDer Parameter engine ermöglicht die Auswahl, welche Engine verwendet werden soll.
Beispiel 3: Partitionierte Speicherung
Parquet unterstützt partitionierte Speicherung nach Spalte, was ein wichtiges Merkmal in der Big-Data-Analyse ist.
Beispiel
import os
import shutil
# DataFrame erstellen
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']
})
# Beispiel 3a: Partitionierung nach einer einzelnen Spalte
# partition_cols gibt die Partitionsspalte an, wodurch Unterverzeichnisse erzeugt werden
if os.path.exists('partitioned'):
shutil.rmtree('partitioned')
df.to_parquet('partitioned', partition_cols=['department'])
print("Exportiert mit Partitionierung nach Abteilung")
# Verzeichnisstruktur der Partitionierung anzeigen
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}')
Ausgabe:
已按 department 分区导出
分区目录结构:
partitioned/
department=HR/
xxx.parquet
department=IT/
xxx.parquet
department=Sales/
xxx.parquet
Code-Erklärung:
partition_colsDer Parameter partition_cols führt eine partitionierte Speicherung nach der angegebenen Spalte durch.- Die partitionierte Speicherung erstellt Unterverzeichnisse im Dateisystem, ein Verzeichnis pro Partitionswert.
- Die partitionierte Speicherung ist sehr vorteilhaft für Big-Data-Abfragen, da nur die benötigten Partitionen gelesen werden müssen.
Beispiel 4: Umgang mit dem Index
Beim Exportieren nach Parquet können Sie wählen, ob der Index eingeschlossen werden soll.
Beispiel
# Erstellen eines DataFrame mit einem Index
df = pd.DataFrame({
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
})
df.index = ['A001', 'A002', 'A003', 'A004']
# Beispiel 4a: Index standardmäßig einschließen
df.to_parquet('with_index.parquet')
print("Export (Index standardmäßig enthalten)")
# Beispiel 4b: Index ausschließen
df.to_parquet('without_index.parquet', index=False)
print("Export (Index nicht enthalten)")
# Beispiel 4c: Index explizit einschließen
df.to_parquet('explicit_index.parquet', index=True)
print("Export (Index explizit einschließen)")
# Lesen und vergleichen
print("nLies und vergleiche die Unterschiede:")
print("nOriginaldaten:")
print(df)
print("nwith_index.parquet gelesen:")
print(pd.read_parquet('with_index.parquet'))
print("nwithout_index.parquet gelesen:")
print(pd.read_parquet('without_index.parquet'))
print("nexplicit_index.parquet gelesen:")
print(pd.read_parquet('explicit_index.parquet'))
Ausgabe:
导出(默认包含索引)
导出(不包含索引)
导出(显式包含索引)
读取并比较差异:
原始数据:
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
Code-Erklärung:
index=TrueEnthält den Index explizit als Spalte.index=FalseEnthält den Index nicht.- Das Standardverhalten hängt von den Index-Einstellungen von pandas ab.
Hinweise
- Verwendung
to_parquet()erfordert Installationpyarrowoderfastparquet。 - Installation empfohlen
pyarrow:pip install pyarrow。 - Parquet ist ein spaltenorientierter Speicher, geeignet für Big-Data-Analyseszenarien, aber nicht für kleine Datenmengen.
- Partitionierte Speicherung kann die Abfrageleistung für Big Data erheblich verbessern.
- Parquet unterstützt komplexe Datentypen (verschachtelte Strukturen), aber sie werden in pandas DataFrames nicht häufig verwendet.
Zusammenfassung
to_parquet()Es ist eine Methode für DataFrame, in das Parquet-Format zu exportieren. Parquet ist das standardmäßige spaltenorientierte Speicherformat im Big-Data-Bereich mit Vorteilen wie hoher Kompressionsrate, hoher Leistung und Unterstützung für Partitionierung.
In Big-Data-Verarbeitungsszenarien ist Parquet das bevorzugte Datenformat. Es ist perfekt kompatibel mit Big-Data-Frameworks wie Apache Spark und Apache Hive. Bei der Verarbeitung großer Datenmengen wird empfohlen, das Parquet-Format anstelle von CSV oder Excel zu verwenden.
Andere Erweiterungen
Pandas Häufige Funktionen