Функция Pandas df.to_parquet()
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 | Описание | Значение по умолчанию |
|---|---|---|---|
| path | str, объект path | Путь к файлу | Обязательный |
| engine | str | Движок: 'auto', 'pyarrow', 'fastparquet' | 'auto' |
| compression | str | Сжатие: 'snappy', 'gzip', 'brotli', None | 'snappy' |
| index | bool, None | Включать ли индекс | Отсутствует |
| partition_cols | list | Столбец(ы) секционирования, сохранение данных с секционированием по столбцу | Отсутствует |
Описание возвращаемого значения
- Тип возвращаемого значения:
None - Записывает данные непосредственно в файл Parquet, возвращаемое значение отсутствует.
Примеры
С помощью следующих примеров всесторонне освойтеto_parquet()различные варианты использования.
Пример 1: Базовое использование - экспорт в файл Parquet
Сначала создайте DataFrame, затем используйтеto_parquet()для экспорта в файл Parquet.
Пример
# Создать пример 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 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 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 вы можете выбрать, включать ли индекс.
Пример
# Создать 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: общие функции