После explode в pandas появился лишний товар: считаем элементы пустых списков
В таблице заказов одна строка содержит целый список артикулов. Аналитик вызывает explode, затем groupby и size, чтобы получить количество товаров. Заказ с пустым списком неожиданно получает один товар. Причина в том, что explode сохраняет для пустого списка строку с пропущенным значением.
Сохранённая строка полезна: пустой заказ не исчезает из таблицы. Но она представляет отсутствие элемента, поэтому считать её как товар нельзя. Разберём, как получить две согласованные таблицы: все исходные заказы и только реальные товарные позиции.
Уточнить, что лежит в списке
Список ['A', 'A'] может означать две единицы одного товара, а может быть дублем источника. В примере считаем каждое вхождение отдельной единицей. Число разных артикулов тогда будет другим показателем, который нужно вычислять через nunique.
Пустой список означает, что у заказа точно нет позиций. Пропуск вместо списка может означать, что состав ещё не загрузили. Если в источнике есть оба случая, сначала добавьте признак полноты состава. Иначе удаление пропусков после explode смешает пустую корзину и отсутствующие данные.
Полный расчёт
import pandas as pd
orders = pd.DataFrame({
'order_id': [101, 102, 103],
'items': [['A', 'A', 'B'], [], ['C']],
})
expanded = orders.explode('items', ignore_index=True)
positions = expanded.dropna(subset=['items'])
counts = positions.groupby('order_id').size().rename('item_count')
report = orders[['order_id']].merge(
counts, on='order_id', how='left', validate='one_to_one'
)
report['item_count'] = report['item_count'].fillna(0).astype('int64')
print(report.to_string(index=False))
assert report['item_count'].tolist() == [3, 0, 1]
assert len(positions) == 4Заказы 101, 102 и 103 получат соответственно 3, 0 и 1 товарную единицу. После удаления пустого элемента заказ 102 отсутствует в таблице позиций. Левое соединение с исходными заказами возвращает его в отчёт, а нулём мы заполняем именно известное отсутствие позиций.
Такой порядок особенно удобен, если позже появятся метрики по заказам. Базовый список заказов сохраняется отдельно от списка элементов. Вы можете посчитать долю пустых корзин и не потерять знаменатель после очистки позиций.
Почему size и count дают разные ответы
После explode метод size считает все строки группы, включая строку с пропуском. Метод count для колонки items пропускает отсутствующее значение. На нашем входе count тоже даст нужные количества, если корректно вернуть отсутствующие группы. Но отдельная таблица positions яснее показывает, какие элементы допускаются к дальнейшему анализу.
Не используйте фильтр по истинности самого значения. Число 0 может быть допустимым кодом, а пустая строка — ошибочным кодом, требующим отдельной проверки. В примере валидным элементом считается любое непропущенное значение; в рабочем справочнике добавьте проверку существования артикула.
Если рядом со списком артикулов лежит список количеств, разворачивайте их совместно только при одинаковой длине в каждой строке. Иначе соответствие «артикул–количество» не определено. Два последовательных explode разных колонок способны создать произведение элементов: два артикула и два количества превратятся в четыре строки вместо двух.
Проверить результат на бизнес-уровне
Сопоставьте сумму посчитанных единиц с суммой длин исходных списков. Для этого исходные значения должны быть именно списками; строка с текстом ['A', 'B'] сама по себе списком не становится. Разберите формат при чтении данных, затем выполняйте explode.
Ещё один контроль — число заказов. Оно должно совпасть с исходным, если отчёт обещает показать все заказы. Число строк товарной таблицы совпадать не обязано: это другая детализация.
Закрепить преобразование можно в подборке pivot_table и explode.
В курсе «Практическая аналитика данных» вы переходите от формы таблицы к проверяемым показателям продаж, клиентов и рекламы. Разобранный здесь контроль детализации понадобится перед расчётом среднего чека и анализом корзин. Откройте программу, чтобы собрать полный аналитический кейс и повторить его на новом периоде.
Продолжить на практике
- Практическая аналитика данных ↗
Превратите знания SQL или Python в аналитическую работу: проверяйте данные, считайте бизнес-метрики, стройте дашборды и объясняйте выводы на трёх прикладных кейсах.
