Función Pandas df.to_parquet()

Pandas 常用函数Funciones comunes de Pandas


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ámetroTipoDescripciónValor predeterminado
pathstr, path objectRuta del archivoObligatorio
enginestrMotor: 'auto', 'pyarrow', 'fastparquet''auto'
compressionstrMétodo de compresión: 'snappy', 'gzip', 'brotli', None'snappy'
indexbool, NoneSi incluir el índiceNone
partition_colslistColumna de partición, almacenamiento por particiones según la columnaNone

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

import pandas as pd

# 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 utilizasnappycompresió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 pandas as pd
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 pandas as pd
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

import pandas as pd

# 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 usarto_parquet()es necesario instalarpyarrowofastparquet。
  • Se recomienda instalarpyarrow: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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones