Pandas: чтение и запись данных
Pandas предоставляет богатый набор функций для чтения и записи различных форматов данных. Помимо часто используемых CSV и Excel, он также поддерживает базы данных SQL, HTML-таблицы, Parquet и другие форматы. В этом разделе представлены эти дополнительные функции ввода-вывода, которые помогут вам гибко обрабатывать импорт и экспорт данных в различных сценариях.
Обзор основных функций ввода-вывода
Функциональность ввода-вывода Pandas очень мощная и поддерживает чтение и запись множества форматов данных. Ниже приведены часто используемые функции чтения и записи:
| Функции чтения | Функции записи | Поддерживаемые форматы | Типичные сценарии |
|---|---|---|---|
pd.read_csv() |
to_csv() |
CSV、TSV | Лог-файлы, табличные данные |
pd.read_excel() |
to_excel() |
Excel(.xlsx, .xls) | Бизнес-отчёты, финансовые данные |
pd.read_sql() |
to_sql() |
Базы данных SQL | Взаимодействие с корпоративными базами данных |
pd.read_html() |
- | Таблицы HTML | Веб-скрейпинг данных |
pd.read_parquet() |
to_parquet() |
Apache Parquet | Анализ и хранение больших данных |
pd.read_feather() |
to_feather() |
Формат Feather | Быстрое чтение/запись, данные в памяти |
pd.read_json() |
to_json() |
JSON | Данные API, веб-сервисы |
pd.read_pickle() |
to_pickle() |
Python pickle | Сериализация объектов Python |
У разных форматов разные сценарии применения. CSV — универсальный формат, но файлы большие; Parquet — колоночное хранилище, подходит для анализа больших данных; Excel подходит для ручного просмотра, но не для больших объёмов данных.
CSV и текстовые файлы
CSV (значения, разделённые запятыми) — самый универсальный формат обмена данными, и Pandas обеспечивает наиболее полную его поддержку.
Общие параметры чтения
Пример
# Базовое чтение
df = pd.read_csv("data.csv")
# Указать разделитель (в CSV по умолчанию запятая, в TSV — табуляция)
df_tsv = pd.read_csv("data.tsv", sep="\t")
# Указать кодировку (обычно используется для файлов на китайском)
df_utf8 = pd.read_csv("data.csv", encoding="utf-8")
df_gbk = pd.read_csv("data.csv", encoding="gbk")
# Пропустить строки (пропускать строки после заголовка или строк комментариев)
df = pd.read_csv("data.csv", skiprows=3) # Пропустить первые 3 строки
df = pd.read_csv("data.csv", skiprows=[2, 4]) # Пропустить строки 2 и 4
# Использовать строку заголовка (первая строка по умолчанию)
df = pd.read_csv("data.csv", header=0) # Использовать строку 0 как заголовок
df = pd.read_csv("data.csv", header=None) # Не использовать заголовок, автоматически сгенерировать 0,1,2...
# Указать имена столбцов
df = pd.read_csv("data.csv", names=["ID", "Name", "Age", "City"])
# Указать столбец индекса
df = pd.read_csv("data.csv", index_col=0) # Использовать столбец 0 как индекс
df = pd.read_csv("data.csv", index_col=["Name"]) # Несколько столбцов в качестве составного индекса
Обработка пропущенных значений
Пример
import numpy as np
# Укажите, какие значения считаются пропущенными
df = pd.read_csv(
"data.csv",
na_values=["NA", "null", "NULL", "N/A", "", " "] # Все эти значения будут распознаны как NaN
)
# Разные столбцы могут использовать разные маркеры пропущенных значений
df = pd.read_csv(
"data.csv",
na_values={
"Age": ["Unknown", "0"], # Пропущенное значение для столбца "Age"
"City": ["Unknown"] # Пропущенное значение для столбца "City"
}
)
# Сохранять определённые значения как обычные значения (не распознавать их как пропущенные)
df = pd.read_csv("data.csv", keep_default_na=False)
Запись CSV-файлов
Пример
# Подготовка тестовых данных
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
"Возраст": [25, 30, 28],
"Город": ["Пекин", "Шанхай", "Гуанчжоу"]
})
# Запись CSV (с индексом по умолчанию)
df.to_csv("output.csv")
# Не записывать индекс
df.to_csv("output.csv", index=False)
# Укажите разделитель
df.to_csv("output.csv", sep="\t")
# Не записывать заголовок
df.to_csv("output.csv", header=False)
# Укажите кодировку
df.to_csv("output.csv", encoding="utf-8-sig") # С BOM, подходит для открытия в Excel
Файлы JSON
JSON (JavaScript Object Notation) — наиболее распространённый формат данных в веб-приложениях. Pandas предоставляет гибкие функции чтения и записи.
Структура JSON и методы чтения
Структуры данных JSON бывают разных видов. При чтении нужно выбирать подходящие параметры в зависимости от фактической структуры:
Пример
import json
# Подготовить тестовые данные JSON
data_records = '''
[
{"name": "Zhang San", "age": 25, "city": "Beijing"},
{"name": "Li Si", "age": 30, "city": "Shanghai"},
{"name": "Wang Wu", "age": 35, "city": "Guangzhou"}
]
'''
# Способ 1: массив JSON (один объект на строку) ->
df = pd.read_json(data_records, orient="records")
print("orient='records':")
print(df)
print()
# Способ 2: объект JSON (пары ключ-значение) -> Series
data_dict = '{"name": "Zhang San", "age": 25, "city": "Beijing"}'
s = pd.read_json(data_dict, typ="series")
print("Чтение как Series:")
print(s)
Формат JSON Lines
JSON Lines (.jsonl) — это формат, в котором каждая строка является полным JSON-объектом, обычно используемый в сценариях логирования и больших данных:
Пример
# Данные в формате JSON Lines
jsonl_data = '''{"name": "Zhang San", "age": 25}
{"name": "Li Si", "age": 30}
{"name": "Wang Wu", "age": 28}
{"name": "Zhao Liu", "age": 35}
'''
# Запись файла JSON Lines
with open("data.jsonl", "w", encoding="utf-8") as f:
f.write(jsonl_data)
# Чтение JSON Lines (каждая строка — объект JSON)
df = pd.read_json("data.jsonl", lines=True)
print(df)
Запись JSON
Пример
df = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
"Возраст": [25, 30, 28],
"Город": ["Пекин", "Шанхай", "Гуанчжоу"]
})
# Запись JSON с различной ориентацией
df.to_json("output_records.json", orient="records", force_ascii=False, indent=2)
df.to_json("output_index.json", orient="index", force_ascii=False, indent=2)
df.to_json("output_columns.json", orient="columns", force_ascii=False, indent=2)
# Формат JSON Lines
df.to_json("output.jsonl", orient="records", lines=True, force_ascii=False)
Сериализация Pickle
Pickle — это встроенный формат сериализации объектов Python, который позволяет сохранять любой объект Python, включая DataFrames и сложные вложенные структуры.
Пример
import pickle
# Создать DataFrame со сложной структурой
df = pd.DataFrame({
"A": range(10),
"B": range(10, 20),
"C": ["foo", "bar"] * 5
})
# Запись файла Pickle
df.to_pickle("data.pkl")
# Чтение файла Pickle
df_loaded = pd.read_pickle("data.pkl")
print(df_loaded)
# Запись со сжатием (сжатие gzip, файл меньшего размера)
df.to_pickle("data.pkl.gz", compression="gzip")
df_loaded = pd.read_pickle("data.pkl.gz", compression="gzip")
Формат Pickle может быть прочитан только Python и не подходит для обмена данными между языками. Кроме того, загрузка файлов Pickle из ненадёжных источников создаёт угрозу безопасности; не загружайте .pkl-файлы неизвестного происхождения.
Производительность и выбор сценария
Разные форматы данных имеют разные характеристики производительности. Выбор подходящего формата может значительно повысить эффективность:
| Формат | Скорость чтения | Скорость записи | Размер файла | Применимый сценарий |
|---|---|---|---|---|
| CSV | Медленная | Средняя | большие | Универсальный формат обмена, читаемый человеком |
| Parquet | Очень быстро | Высокая | Очень маленькая | Анализ больших данных, колоночные запросы |
| Feather | Чрезвычайно быстрый | Чрезвычайно быстрый | большие | Быстрая передача данных в памяти |
| Pickle | Высокая | Высокая | Средняя | Сохранение объектов Python |
| JSON | Медленная | Средняя | Очень большой | Web API, кросс-языковой |
Типичные проблемы и меры предосторожности
1. Недостаточно памяти при чтении больших файлов
Для очень больших CSV- или JSON-файлов можно использоватьchunksizeпараметр для чтения по частям, избегая загрузки всего в память сразу.
2. Проблемы с китайской кодировкой
При обработке китайских файлов обязательно указывайте правильную кодировку. Распространённые кодировки включают utf-8, gbk, gb2312, utf-8-sig (BOM) и т. д.
3. Файл повреждён после записи
Перед записью важных данных рекомендуется сначала выполнить чтение и проверку. При записи больших файлов использование сжатого формата может уменьшить дисковый ввод-вывод и снизить риск повреждения данных.
4. Ограничения формата Excel
Excel 2003 (.xls) поддерживает максимум 65,536 строк на лист, а Excel 2007 (.xlsx) — до 1,048,576 строк. Если лимит превышен, рассмотрите другие форматы.
Другие расширения