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 обеспечивает наиболее полную его поддержку.

Общие параметры чтения

Пример

import pandas as pd

# Базовое чтение
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 pandas as pd
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-файлов

Пример

import pandas as pd

# Подготовка тестовых данных
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 pandas as pd
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-объектом, обычно используемый в сценариях логирования и больших данных:

Пример

import pandas as pd

# Данные в формате 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

Пример

import pandas as pd

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 pandas as pd
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 строк. Если лимит превышен, рассмотрите другие форматы.

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