Pandas df.to_parquet()-Funktion

Pandas 常用函数Pandas Häufige Funktionen


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

ParameterTypeBeschreibungStandardwert
pathstr, PfadobjektDateipfadErforderlich
enginestrEngine: 'auto', 'pyarrow', 'fastparquet''auto'
compressionstrKomprimierung: 'snappy', 'gzip', 'brotli', None'snappy'
indexbool, NoneGibt an, ob der Index einbezogen werden sollKeine
partition_colsListePartitionsspalte(n), Daten partitioniert nach Spalte speichernKeine

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

import pandas as pd

# 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 wirdsnappyKomprimierung, 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 pandas as pd
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 pandas as pd
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

import pandas as pd

# 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

  • Verwendungto_parquet()erfordert Installationpyarrowoderfastparquet。
  • Installation empfohlenpyarrow: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.

Pandas 常用函数Pandas Häufige Funktionen

Andere Erweiterungen