Функция Pandas df.to_parquet()

Pandas 常用函数Pandas: общие функции


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, ...)

Описание параметра

ПараметрTypeОписаниеЗначение по умолчанию
pathstr, объект pathПуть к файлуОбязательный
enginestrДвижок: 'auto', 'pyarrow', 'fastparquet''auto'
compressionstrСжатие: 'snappy', 'gzip', 'brotli', None'snappy'
indexbool, NoneВключать ли индексОтсутствует
partition_colslistСтолбец(ы) секционирования, сохранение данных с секционированием по столбцуОтсутствует

Описание возвращаемого значения

  • Тип возвращаемого значения: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': ['Пекин', 'Шанхай', 'Гуанчжоу', 'Шэньчжэнь', 'Ханчжоу'],
    '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.
  • По умолчанию используетсяsnappycompression, с замечательными результатами сжатия.
  • Файлы 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

Вывод:

不同压缩方式的文件大小对比:
  snappy: 约 100KB
  gzip: 约 80KB
  brotli: 约 70KB
  none: 约 200KB

不同压缩方式各有优劣:
  snappy: 速度快,压缩比适中(默认推荐)
  gzip: 压缩比更高,适合存储
  brotli: 最高压缩比,适合冷数据
  none: 无压缩,速度最快

Пояснение кода:

  • compressionПараметр compression позволяет выбирать различные методы сжатия.
  • snappyявляется опцией по умолчанию, обеспечивающей баланс между скоростью и степенью сжатия.
  • gzipИмеет более высокую степень сжатия, но немного медленнее.
  • engineПараметр 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', 'Beijing']
})

# Пример 3a: Секционирование по одному столбцу
# partition_cols задает столбец секционирования, который создает подкаталоги
if os.path.exists('partitioned'):
    shutil.rmtree('partitioned')

df.to_parquet('partitioned', partition_cols=['department'])
print("Экспортировано с секционированием по отделу")

# Просмотр структуры каталогов секционирования
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Параметр partition_cols выполняет партиционированное хранение по указанному столбцу.
  • Партиционированное хранилище создает подкаталоги в файловой системе, по одному каталогу на каждое значение партиции.
  • Партиционированное хранилище очень полезно для запросов к большим данным, так как нужно читать только необходимые партиции.

Пример 4: Обработка индекса

При экспорте в Parquet вы можете выбрать, включать ли индекс.

Пример

import pandas as pd

# Создать DataFrame с индексом
df = pd.DataFrame({
    'name': ['Tom', 'Jerry', 'Mike', 'Lucy'],
    'age': [28, 35, 42, 26],
    'city': ['Пекин', 'Шанхай', 'Гуанчжоу', '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("nЧтение with_index.parquet:")
print(pd.read_parquet('with_index.parquet'))
print("nЧтение without_index.parquet:")
print(pd.read_parquet('without_index.parquet'))
print("nЧтение explicit_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Явно включает индекс как столбец.
  • 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. При обработке крупномасштабных данных рекомендуется использовать формат Parquet вместо CSV или Excel.

Pandas 常用函数Pandas: общие функции

Другие расширения