Pandas: экспорт данных

Pandas предоставляет богатые возможности экспорта, позволяя экспортировать DataFrame в различные распространённые форматы, включая CSV, Excel, базы данных SQL, JSON и другие. В этом разделе подробно рассматриваются использование и особенности каждого метода экспорта.


Экспорт в CSV

CSV — наиболее распространённый формат обмена данными. На экспорт влияет кодировка по умолчанию в среде, поэтому нужно обращать внимание на проблемы с кодировкой китайских текстов.

Базовый экспорт

Пример

import pandas as pd

# Подготовка тестовых данных
df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
    "Возраст": [25, 30, 28, 35],
    City: ["Beijing", "Shanghai", Guangzhou, Shenzhen],
    Salary: [12000, 15000, 11000, 18000]
})

# Простейший экспорт (включая индекс)
df.to_csv("output.csv")

# Без индекса
df.to_csv("output.csv", index=False)

Обработка китайской кодировки

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    City: ["Beijing", "Shanghai", Guangzhou]
})

# Кодировка UTF-8 (рекомендуется)
df.to_csv("output_utf8.csv", encoding="utf-8")

# UTF-8 с BOM (Excel открывает без искажённых символов)
df.to_csv("output_utf8_bom.csv", encoding="utf-8-sig")

# Кодировка GBK (подходит для устаревших систем)
df.to_csv("output_gbk.csv", encoding="gbk")

# Проверка кодировки
import os
print("Сравнение размеров файлов:")
for f in ["output_utf8.csv", "output_utf8_bom.csv", "output_gbk.csv"]:
    print(f"{f}: {os.path.getsize(f)} bytes")

Пояснение параметров экспорта

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
})

# Укажите разделитель (по умолчанию — запятая)
df.to_csv("output.tsv", sep="\t")  # Формат TSV

# Не записывать заголовок
df.to_csv("output.csv", header=False)

# Пользовательские имена столбцов (когда header=False)
df.to_csv("output.csv", header=False, columns=["Name", "Age"])

# Экспортировать только определённые столбцы
df.to_csv("output.csv", columns=["Name"])  # Экспортировать только столбец "Name"

# Обработка пропущенных значений
import numpy as np
df_with_na = pd.DataFrame({
    "A": [1, 2, np.nan, 4],
    "B": ["a", Отсутствует, "c", "d"]
})
df_with_na.to_csv("output.csv", na_rep="NULL")  # Задать представление пропущенных значений

# Точность чисел с плавающей точкой
df = pd.DataFrame({"value": [1.23456789, 2.3456789]})
df.to_csv("output.csv", float_format="%.2f")  # Оставить 2 знака после запятой

Экспорт в Excel

Формат Excel подходит для ручного просмотра и редактирования, но экспорт больших файлов выполняется медленнее.

Установка зависимостей

pip install openpyxl xlwt

Базовый экспорт

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    "Возраст": [25, 30, 28],
    City: ["Beijing", "Shanghai", Guangzhou],
    Salary: [12000, 15000, 11000]
})

# Экспорт в Excel (формат .xlsx, требуется openpyxl)
df.to_excel("output.xlsx", index=False)

# Экспорт в устаревший формат .xls (требуется xlwt)
df.to_excel("output.xls", index=False)

Экспорт нескольких листов

Пример

import pandas as pd

# Создать несколько DataFrame
df1 = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df2 = pd.DataFrame({"C": [7, 8, 9], "D": [10, 11, 12]})

# Экспорт на разные листы в одном и том же Excel
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
    df1.to_excel(writer, sheet_name="Sheet1", index=False)
    df2.to_excel(writer, sheet_name="Sheet2", index=False)

print(Несколько листов успешно экспортировано)

Форматированный экспорт

Пример

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Выравнивание

# Создать DataFrame
df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    "Возраст": [25, 30, 28],
    Salary: [12000, 15000, 11000]
})

# Использование ExcelWriter для более тонкого контроля
with pd.ExcelWriter("output_formatted.xlsx", engine="openpyxl") as writer:
    df.to_excel(writer, sheet_name="Информация о сотрудниках", index=False)

    # Получить лист
    worksheet = writer.sheets["Информация о сотрудниках"]

    # Установить ширину столбца
    worksheet.column_dimensions["A"].width = 15
    worksheet.column_dimensions["B"].width = 10
    worksheet.column_dimensions["C"].width = 12

    # Закрепить первую строку
    worksheet.freeze_panes = "A2"

print("Форматированный экспорт завершён")

Экспорт в базу данных

Вы можете напрямую экспортировать DataFrame в базу данных SQL. Подробности см. в главе «Pandas: чтение базы данных SQL».

Пример

import pandas as pd
from sqlalchemy import create_engine

# Создать базу данных в памяти
engine = create_engine("sqlite:///output.db")

# Подготовка данных
df = pd.DataFrame({
    "name": ["Чжан Сань", "Ли Сы", "Ван У"],
    "age": [25, 30, 28],
    "city": ["Пекин", "Шанхай", Guangzhou]
})

# Экспорт в базу данных
# if_exists: 'fail' (по умолчанию) / 'replace' / 'append'
df.to_sql("users", con=engine, if_exists="replace", index=False)

print("Экспорт в базу данных выполнен успешно")

Экспорт в JSON

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    "Возраст": [25, 30, 28]
})

# Различные форматы orient
df.to_json("records.json", orient="records", force_ascii=False, indent=2)
df.to_json("index.json", orient="index", force_ascii=False)
df.to_json("columns.json", orient="columns", force_ascii=False)

# Формат JSON Lines (один объект JSON на строку, подходит для логов)
df.to_json("lines.json", orient="records", lines=True, force_ascii=False)

Экспорт в другие форматы

Экспорт в HTML

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
})

# Экспорт в HTML-таблицу
df.to_html("output.html", index=False)

# Добавить стили
df.to_html(
    "output_styled.html",
    index=False,
    border=2,
    classes=["table", "table-striped"]  # Добавить CSS-классы
)

Экспорт в Markdown

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
    "Возраст": [25, 30, 28]
})

# Экспорт в таблицу Markdown
print(df.to_markdown(index=False))
# Вывод:
# | Имя | Возраст |
# | ---- | ---- |
# | Чжан Сань | 25 |
# | Ли Сы | 30 |
# | Ван У | 28 |

# Сохранить в файл
with open("output.md", "w") as f:
    f.напишите(df.to_markdown(index=False))

Экспорт в LaTeX

Пример

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Чжан Сань", "Ли Сы"],
    "Возраст": [25, 30]
})

# Экспорт в таблицу LaTeX
print(df.to_latex(index=False))
# Вывод кода таблицы LaTeX

Экспорт в Pickle

Пример

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": ["a", "b", "c"]
})

# Экспорт в Pickle (сохранение типов данных)
df.to_pickle("data.pkl")

# Сжатый формат
df.to_pickle("data.pkl.gz", compression="gzip")

print("Экспорт Pickle завершён")

Экспорт больших данных

При экспорте больших объемов данных необходимо обращать внимание на проблемы с памятью и производительностью.

Пример

import pandas as pd

# Рекомендации по экспорту больших объемов данных:
# 1. Используйте chunksize для пакетной записи
df = pd.DataFrame({"a": range(1000000), "b": range(1000000)})

# Запись CSV по частям
csv_path = "large_output.csv"
df.to_csv(csv_path, index=False, chunksize=100000)

# 2. Используйте более эффективный формат (Parquet)
df.to_parquet("large_output.parquet", index=False)

# 3. Используйте сжатый формат, чтобы сократить ввод-вывод
df.to_csv("large_output.csv.gz", index=False, compression="gzip")

print("Экспорт большого объёма данных завершён")

Типичные проблемы и что следует учитывать

1. Excel открывает CSV-файлы с искажённым текстом

Используйтеutf-8-sigЭкспортируйте с указанием кодировки, и Excel сможет корректно распознавать китайские символы.

2. Недостаточно памяти при экспорте больших данных

ИспользуйтеchunksizeЗаписывайте пакетами, настроив параметры, или используйте формат Parquet вместо CSV.

3. Формат даты и времени теряется

При экспорте в CSV он будет преобразован в строку. Можно указатьdate_formatпараметры для управления форматом.

4. Несоответствие типов при экспорте в базу данных

Вы можете использоватьdtypeпараметры для явного указания типов столбцов.

Для повседневного анализа данных рекомендуется формат Parquet. Его преимущества — высокая степень сжатия, быстрое чтение/запись и сохранение типов данных. Используйте форматы Excel или CSV только тогда, когда требуется ручной просмотр или обмен.

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