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

Аналитические данные приходят не только в CSV. Финансовый отчёт лежит в Excel с несколькими листами, API возвращает вложенный JSON, а подготовленный слой хранится в Parquet. У каждого формата есть свои ловушки: заголовки, типы, merged cells, timezone и разная структура вложенности.
Коротко
Первые минуты после загрузки нужно потратить на проверку формы: названия колонок, типы, количество строк, лист или путь внутри JSON. Сохраняй типы и схему отдельно от кода чтения, чтобы изменение файла не прошло незаметно.
- Excel — это книга с листами, а не одна таблица.
- JSON может быть списком записей, словарём или вложенным ответом API.
- Parquet хранит типы и колонки эффективнее CSV, но требует совместимого engine.
- Не смешивай файлы разных периодов без проверки схемы.
Excel: выбрать лист и пропустить служебные строки
`read_excel` умеет читать конкретный лист, диапазон колонок и строку заголовка. Если файл оформлен для человека, первые строки могут содержать название отчёта, а настоящие колонки начинаются ниже. После чтения проверь, что `order_id` действительно стал колонкой, а не попал в первую строку данных.
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 без необходимости: оставь только поля, которые отвечают на вопрос.
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, он сохраняет типы, поэтому дата и категория не превращаются в строки при каждом чтении. Если нужен только один срез, читай нужные колонки и фильтруй период как можно раньше.
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.
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')Материалы по теме
Как тестировать аналитические расчёты на Python и pandas
Практический гайд по тестам для аналитика: проверить метрики на маленьком датасете, поймать регрессию и защитить расчёт от тихих изменений.
Читать материал
Как ускорить pandas: память, типы и обработка больших файлов
Что делать, если pandas медленно работает или не помещает файл в память: категории, downcast, chunksize, Parquet и контроль размера данных.
Читать материал
Pandas apply и векторизация: как писать быстрее и понятнее
Когда использовать apply, почему векторные операции быстрее и как переписать медленный построчный расчёт в pandas.
Читать материал