КПКейсПрактика
Все материалы
Продуктовая аналитикагайдстарт

Как загружать Excel, JSON и Parquet в pandas

Практический разбор источников в pandas: прочитать Excel и JSON, выбрать лист, сохранить типы и перейти с CSV на Parquet без сюрпризов.

КПКейсПрактика6 августа 2026 г.11 мин
Два аналитика загружают Excel, JSON и Parquet и собирают их в одну таблицу pandas.

Аналитические данные приходят не только в CSV. Финансовый отчёт лежит в Excel с несколькими листами, API возвращает вложенный JSON, а подготовленный слой хранится в Parquet. У каждого формата есть свои ловушки: заголовки, типы, merged cells, timezone и разная структура вложенности.

Коротко

Первые минуты после загрузки нужно потратить на проверку формы: названия колонок, типы, количество строк, лист или путь внутри JSON. Сохраняй типы и схему отдельно от кода чтения, чтобы изменение файла не прошло незаметно.

  • Excel — это книга с листами, а не одна таблица.
  • JSON может быть списком записей, словарём или вложенным ответом API.
  • Parquet хранит типы и колонки эффективнее CSV, но требует совместимого engine.
  • Не смешивай файлы разных периодов без проверки схемы.

Excel: выбрать лист и пропустить служебные строки

`read_excel` умеет читать конкретный лист, диапазон колонок и строку заголовка. Если файл оформлен для человека, первые строки могут содержать название отчёта, а настоящие колонки начинаются ниже. После чтения проверь, что `order_id` действительно стал колонкой, а не попал в первую строку данных.

pythonЗагрузить нужный лист Excel
orders = pd.read_excel(
    'input/monthly_report.xlsx',
    sheet_name='Orders',
    header=2,
    usecols=['order_id', 'created_at', 'channel', 'revenue'],
)

print(orders.columns.tolist())
print(orders.shape)

JSON: сначала понять структуру ответа

В JSON записи могут лежать внутри `data`, `results` или нескольких вложенных объектов. `read_json` удобен для плоского списка, а `json_normalize` — для ответа API, где поля находятся внутри словарей. Не разворачивай весь JSON без необходимости: оставь только поля, которые отвечают на вопрос.

pythonРазвернуть вложенные записи API
import json
from pandas import json_normalize

with open('input/response.json', encoding='utf-8') as file:
    payload = json.load(file)

events = json_normalize(payload['data'])
events = events.rename(columns={'user.id': 'user_id'})
events = events[['user_id', 'event_name', 'occurred_at']]

Parquet: типы и выбор колонок

Parquet удобен для очищенных аналитических слоёв. В отличие от CSV, он сохраняет типы, поэтому дата и категория не превращаются в строки при каждом чтении. Если нужен только один срез, читай нужные колонки и фильтруй период как можно раньше.

pythonПрочитать колонночный слой Parquet
orders = pd.read_parquet(
    'data/clean/orders.parquet',
    columns=['order_id', 'created_at', 'revenue'],
)

orders['created_at'] = pd.to_datetime(orders['created_at'], utc=True)
orders = orders.loc[orders['created_at'].dt.month.eq(8)]

Единый контракт для разных источников

Если один отчёт собирается из Excel сегодня и Parquet завтра, приведи оба источника к одинаковой схеме до объединения. Одинаковые названия колонок, типы и зерно важнее формата файла. Держи проверку колонок рядом с загрузкой, чтобы ошибка появилась до merge и groupby.

pythonПроверить схему после загрузки
EXPECTED = {'order_id', 'created_at', 'channel', 'revenue'}
missing = EXPECTED.difference(orders.columns)
if missing:
    raise ValueError(f'Missing columns: {sorted(missing)}')

orders['created_at'] = pd.to_datetime(orders['created_at'], errors='coerce', utc=True)
orders['revenue'] = pd.to_numeric(orders['revenue'], errors='coerce')
Продолжить чтение
Вся библиотека