Función Pandas df.to_parquet()
to_parquet()Es un método de DataFrame utilizado para exportar datos a archivos en formato Parquet.
Parquet es un formato de archivo de almacenamiento columnar, diseñado específicamente para escenarios de análisis de big data. Tiene ventajas como alta relación de compresión, alto rendimiento de lectura y escritura y soporte para tipos de datos complejos. Es el formato estándar de frameworks de big data como Apache Hadoop y Apache Spark.
Sintaxis básica y parámetros
Formato de sintaxis
DataFrame.to_parquet(path, engine='auto', compression='snappy',
index=None, partition_cols=None, storage_options=None, ...)
Descripción de parámetros
| Parámetro | Tipo | Descripción | Valor predeterminado |
|---|---|---|---|
| path | str, path object | Ruta del archivo | Obligatorio |
| engine | str | Motor: 'auto', 'pyarrow', 'fastparquet' | 'auto' |
| compression | str | Método de compresión: 'snappy', 'gzip', 'brotli', None | 'snappy' |
| index | bool, None | Si incluir el índice | None |
| partition_cols | list | Columna de partición, almacenamiento por particiones según la columna | None |
Descripción del valor de retorno
- Tipo de retorno:
None - Escribe los datos directamente en el archivo Parquet, sin valor de retorno.
Ejemplos
A través de los siguientes ejemplos, domina completamenteto_parquet()los diversos usos de.
Ejemplo 1: Uso básico - Exportar a archivo Parquet
Primero crea un DataFrame y luego usato_parquet()para exportarlo a un archivo Parquet.
Ejemplo
# Crear un DataFrame de ejemplo
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)
# Ejemplo 1a: Exportación básica
# path: ruta del archivo (obligatorio)
# Por defecto se usa compresión snappy
df.to_parquet('employees.parquet')
print("Exportado a employees.parquet")
# Ver el tamaño del archivo
import os
file_size = os.path.getsize('employees.parquet')
print(f"Tamaño del archivo: {file_size} bytes")
# Ejemplo 1b: Verificación de lectura
# Se requiere instalar pyarrow o fastparquet
df_check = pd.read_parquet('employees.parquet')
print("nVerificación de lectura:")
print(df_check)
Resultado de la ejecución:
已导出到 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
Análisis del código:
to_parquet()Exporta el DataFrame al formato Parquet.- Por defecto se utiliza
snappycompresión, con un efecto de compresión notable. - Los archivos Parquet son mucho más pequeños que los archivos CSV y su lectura también es más rápida.
Ejemplo 2: Selección del motor y método de compresión
El formato Parquet admite múltiples motores y métodos de compresión, que se pueden elegir según las necesidades.
Ejemplo
import os
# Crear un DataFrame más grande para observar el efecto de compresión
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)
})
# Ejemplo 2a: Usar diferentes métodos de compresión
# snappy: compresión rápida, alta velocidad, relación de compresión moderada (predeterminado)
df_large.to_parquet('output_snappy.parquet', compression='snappy')
# gzip: alta relación de compresión, archivo más pequeño
df_large.to_parquet('output_gzip.parquet', compression='gzip')
# brotli: mayor relación de compresión
df_large.to_parquet('output_brotli.parquet', compression='brotli')
# Sin compresión
df_large.to_parquet('output_none.parquet', compression=None)
# Comparar tamaños de archivo
print("Comparación del tamaño de archivo con diferentes métodos de compresión:")
for name in ['snappy', 'gzip', 'brotli', 'none']:
size = os.path.getsize(f'output_{name}.parquet')
print(f" {name}: {size:,} bytes")
print()
# Ejemplo 2b: Seleccionar motor
# auto: selección automática (predeterminado)
# pyarrow: implementación de Apache Arrow, funciones completas y buen rendimiento
# fastparquet: implementación en Python puro, buena compatibilidad
print("Motores disponibles: auto, pyarrow, fastparquet")
print("Uso actual:", end=" ")
# Verificar motores disponibles
try:
import pyarrow
print("pyarrow")
except ImportError:
pass
try:
import fastparquet
print("fastparquet")
except ImportError:
pass
Resultado de la ejecución:
不同压缩方式的文件大小对比: snappy: 约 100KB gzip: 约 80KB brotli: 约 70KB none: 约 200KB 不同压缩方式各有优劣: snappy: 速度快,压缩比适中(默认推荐) gzip: 压缩比更高,适合存储 brotli: 最高压缩比,适合冷数据 none: 无压缩,速度最快
Análisis del código:
compressionEl parámetro permite elegir diferentes métodos de compresión.snappyEs la opción predeterminada, que equilibra la velocidad y la relación de compresión.gzipLa relación de compresión es mayor, pero la velocidad es un poco más lenta.engineEl parámetro permite elegir qué motor utilizar.
Ejemplo 3: Almacenamiento por particiones
Parquet admite almacenamiento por particiones por columnas, una característica importante en el análisis de big data.
Ejemplo
import os
import shutil
# Crear un 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']
})
# Ejemplo 3a: Particionar por una sola columna
# partition_cols especifica la columna de partición, se generarán subdirectorios
if os.path.exists('partitioned'):
shutil.rmtree('partitioned')
df.to_parquet('partitioned', partition_cols=['department'])
print("Exportado con partición por department")
# Ver la estructura de directorios de las particiones
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}')
Resultado de la ejecución:
已按 department 分区导出
分区目录结构:
partitioned/
department=HR/
xxx.parquet
department=IT/
xxx.parquet
department=Sales/
xxx.parquet
Análisis del código:
partition_colsEl parámetro realiza almacenamiento por particiones según la columna especificada.- El almacenamiento por particiones crea subdirectorios en el sistema de archivos, un directorio por cada valor de partición.
- El almacenamiento por particiones es muy ventajoso para consultas de big data, ya que permite leer solo las particiones necesarias.
Ejemplo 4: Manejo del índice
Al exportar a Parquet se puede elegir si se incluye el índice.
Ejemplo
# Crear un DataFrame con índice
df = pd.DataFrame({
'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
'age': [28, 35, 42, 26],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
})
df.index = ['A001', 'A002', 'A003', 'A004']
# Ejemplo 4a: Incluye el índice por defecto
df.to_parquet('with_index.parquet')
print("Exportar (incluye el índice por defecto)")
# Ejemplo 4b: Sin incluir el índice
df.to_parquet('without_index.parquet', index=False)
print("Exportar (sin incluir el índice)")
# Ejemplo 4c: Incluir el índice explícitamente
df.to_parquet('explicit_index.parquet', index=True)
print("Exportar (incluir el índice explícitamente)")
# Leer y comparar
print("nLeer y comparar diferencias:")
print("nDatos originales:")
print(df)
print("nLeer with_index.parquet:")
print(pd.read_parquet('with_index.parquet'))
print("nLeer without_index.parquet:")
print(pd.read_parquet('without_index.parquet'))
print("nLeer explicit_index.parquet:")
print(pd.read_parquet('explicit_index.parquet'))
Resultado de la ejecución:
导出(默认包含索引)
导出(不包含索引)
导出(显式包含索引)
读取并比较差异:
原始数据:
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
Análisis del código:
index=TrueIncluye explícitamente el índice como una columna.index=FalseNo incluye el índice.- El comportamiento predeterminado depende de la configuración de índices de pandas.
Notas importantes
- Para usar
to_parquet()es necesario instalarpyarrowofastparquet。 - Se recomienda instalar
pyarrow:pip install pyarrow。 - Parquet es almacenamiento columnar, adecuado para escenarios de análisis de big data, no adecuado para datos pequeños.
- El almacenamiento por particiones puede mejorar significativamente el rendimiento de las consultas de big data.
- Parquet admite tipos de datos complejos (estructuras anidadas), pero no se usa comúnmente con pandas DataFrame.
Resumen
to_parquet()Es el método de DataFrame para exportar al formato Parquet. Parquet es el formato de almacenamiento columnar estándar en el ámbito del big data, con ventajas como alta relación de compresión, alto rendimiento y soporte de particiones.
En escenarios de procesamiento de big data, Parquet es el formato de datos preferido. Es perfectamente compatible con frameworks de big data como Apache Spark y Apache Hive. Si se manejan datos a gran escala, se recomienda usar el formato Parquet en lugar de CSV o Excel.
Otras extensiones
Funciones comunes de Pandas