Все значения неизвестны, а сумма равна нулю: min_count в pandas

В ежедневном отчёте два прибора показали нулевой расход. Но первый действительно передал два нулевых замера, а второй весь день молчал. Обычная сумма пропусков способна превратить обе ситуации в одинаковый ноль. После этого уже трудно понять, где экономия, а где поломка сбора.

Ноль тоже является наблюдением

Суммирование в pandas обычно пропускает отсутствующие значения. Если известных чисел совсем нет, по умолчанию получается ноль. Для технической операции это допустимое начальное значение суммы. Для отчёта о расходе оно может оказаться ложным утверждением: мы ещё не знаем, сколько потребил прибор.

Параметр min_count задаёт минимальное число известных значений, необходимое для результата. При min_count=1 полностью неизвестная группа сохраняет пропуск. Группа из известных нулей остаётся нулевой. Однако одна известная запись среди множества потерянных всё равно даст число: этот параметр не проверяет полноту измерений.

Считать результат и его покрытие вместе

В примере у A два нулевых показания, у B два пропуска, у C известно одно из двух значений. В таблице сохраняем три поля: сумму с min_count=1, число поступивших строк и число известных значений. Их сочетание позволяет выбрать действие для каждой группы.

Для C сумма 7 является частичным итогом, а не полным расходом за день. Это важно показать до решения сравнивать приборы. Нельзя считать, что любой числовой результат автоматически прошёл проверку качества.

import pandas as pd
measurements = pd.DataFrame({"device": ["A", "A", "B", "B", "C", "C"],
                             "usage": [0.0, 0.0, None, None, 7.0, None]})
g = measurements.groupby("device")["usage"]
report = pd.DataFrame({"total": g.sum(min_count=1),
                       "known": g.count(), "rows": g.size()})
report["complete"] = report["known"].eq(report["rows"])
print(report)
assert report.loc["A", "total"] == 0
assert pd.isna(report.loc["B", "total"])
assert report.loc["C", "total"] == 7
assert report["complete"].to_dict() == {"A": True, "B": False, "C": False}

Результат для A — подтверждённый ноль, для B — неизвестное значение, для C — 7 по неполным данным. Столбец complete здесь проверяет заполненность имеющихся строк. Он ещё не знает, сколько замеров прибор должен был передать по расписанию. Если отсутствующая строка вообще не попала в таблицу, count и size её не увидят.

Проверить ожидаемое число замеров

Когда известно расписание, добавьте ожидаемое количество или постройте сетку «прибор — момент». Тогда появится возможность отличить пропуск в существующей записи от полностью отсутствующей записи. Например, для прибора с двумя обязательными замерами в день одна заполненная строка означает неполный день даже при отсутствии NaN в исходном файле.

Выбор min_count зависит от назначения результата. Для суммы задолженности по известным операциям достаточно одного числа, если отчёт прямо описывает известную часть. Для расчёта полного суточного потребления нужны все ожидаемые интервалы либо согласованное восстановление. Не стоит автоматически подставлять среднее соседних дней: оно добавляет предположение, которое затем попадёт в сравнение и планирование.

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

Такое же правило полезно для себестоимости, часов работы и количества товара. Полностью пустая группа не должна превращаться в бесплатную поставку или нулевые трудозатраты только из-за начального значения суммы. Прежде чем менять агрегат, выпишите три контрольных входа: известные нули, одни пропуски и смесь чисел с пропусками. Правильный отчёт должен сохранять различия, которые влияют на решение.

Закрепить на практике

Начните с бесплатного урока о пропусках, fillna и dropna: в нём отработаете обнаружение и обработку неизвестных значений. Затем примените полученную базу к примеру статьи и решите, какие группы можно суммировать в вашем отчёте. Откройте бесплатный урок и задачи.

Продолжить на практике

  • NumPy и pandas: практический тренажёр ↗

    Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.