Pandas: экспорт данных
Pandas предоставляет богатые возможности экспорта, позволяя экспортировать DataFrame в различные распространённые форматы, включая CSV, Excel, базы данных SQL, JSON и другие. В этом разделе подробно рассматриваются использование и особенности каждого метода экспорта.
Экспорт в CSV
CSV — наиболее распространённый формат обмена данными. На экспорт влияет кодировка по умолчанию в среде, поэтому нужно обращать внимание на проблемы с кодировкой китайских текстов.
Базовый экспорт
Пример
# Подготовка тестовых данных
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)
Обработка китайской кодировки
Пример
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")
Пояснение параметров экспорта
Пример
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
Базовый экспорт
Пример
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)
Экспорт нескольких листов
Пример
# Создать несколько 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(Несколько листов успешно экспортировано)
Форматированный экспорт
Пример
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».
Пример
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
Пример
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
Пример
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
Пример
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
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы"],
"Возраст": [25, 30]
})
# Экспорт в таблицу LaTeX
print(df.to_latex(index=False))
# Вывод кода таблицы LaTeX
Экспорт в Pickle
Пример
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 завершён")
Экспорт больших данных
При экспорте больших объемов данных необходимо обращать внимание на проблемы с памятью и производительностью.
Пример
# Рекомендации по экспорту больших объемов данных:
# 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 только тогда, когда требуется ручной просмотр или обмен.