Неизвестный статус стал NaN: проверяем словарь категорий pandas
В регулярной выгрузке статус заказа переводится в category, чтобы хранить ограниченный словарь значений. На этой неделе источник добавил новый статус returned. После преобразования часть строк стала пустой, и отчёт по статусам перестал показывать возвраты. На входе значения были, но мы потеряли их уже внутри обработки.
Явный CategoricalDtype задаёт допустимые категории. Значение, которого нет в этом наборе, при приведении превращается в пропуск. Это полезная модель хранения, но сама по себе она не является проверкой входного контракта: исходное написание неизвестного значения надо сохранить до преобразования.
Как изменить решение
import pandas as pd
raw = pd.Series(['paid', 'returned', None], dtype='string')
allowed = ['new', 'paid', 'cancelled']
unknown = raw.notna() & ~raw.isin(allowed)
assert raw[unknown].tolist() == ['returned']
print(raw[unknown].tolist())
# Расширяем словарь только после согласования нового статуса.
dtype = pd.CategoricalDtype(allowed + ['returned'])
typed = raw.astype(dtype)
assert typed.isna().sum() == 1
print(typed.astype('string').tolist())Маска отделяет настоящий пропуск от нового значения. После согласованного расширения словаря returned сохраняется, а исходный None остаётся единственным пропуском. Мы не заменяем неизвестный статус ближайшим известным и не теряем возможность объяснить изменение.
Для обязательного поля неизвестные значения обычно должны останавливать публикацию отчёта. Для необязательного можно сохранить таблицу отклонений и явно показать неполноту. Главное — не смешать эти строки с давно известной категорией unknown, если она уже существует в бизнес-модели.
Что проверить на своих данных
Запустите пример после установки python -m pip install pandas. Затем добавьте строку Paid с другим регистром и строку с хвостовым пробелом. Если контракт разрешает нормализацию, выполните её до проверки словаря, сохранив исходное значение для разбора. Если не разрешает, обе строки должны попасть в ошибки.
Отдельно проверьте агрегацию по категориям. Параметр observed определяет, выводить ли только наблюдаемые группы или также незаполненные категории; задавайте его явно, если состав строк отчёта важен. Появившаяся категория с нулевой суммой и пропавшие входные значения — разные ситуации. Первая относится к форме результата, вторая означает потерю смысла при приведении типа. Для ежедневного контроля полезно считать число неизвестных значений до astype и число пропусков после него: эти цифры объясняют, почему отчёт изменился.
Практика дальше
Проверка словаря статусов нужна и в итоговой обработке заказов. В тренажёре «NumPy и pandas» вы приводите даты и статусы к единому виду, убираете дубли и собираете клиентский отчёт. Программа включает 124 задачи с кодом и автоматической проверкой.
Посмотреть программу и практику курса
Источник: Неизвестный статус стал NaN — официальная документация.
Другие задачи по теме: Календарь, пропуски и точность вычислений.
Продолжить на практике
- NumPy и pandas: практический тренажёр ↗
Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.
