← Все курсы · Все руководства

Проверка сценария очистки до того, как он затронет ваши данные

Майкл Носито · Обновлено в августе 2026 г. · Все числа на этой странице были обработаны до их публикации.

Сценарий очистки — это список решений о том, что означают ваши данные, записанный в виде кода. Отбросьте эти строки. Считайте этот пробел нулем. Предположим, что эти два написания относятся к одной и той же компании. Каждый из них оправдан в одной ситуации и неправ в другой, и ни один из них не приводит к ошибке.

Что вы делаете: для каждой операции записывайте, что она изменила, и решайте, факт это или предположение. Предположения идут в описании.

Краткая версия. Выведите значения до и после. Подсчеты - это обзор.

Измерительный жгут

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

def snapshot(df, label):
    print(label, 'rows', len(df))
    print(df.isna().sum())
    print('distinct ids', df['customer_id'].nunique())

snapshot(raw, 'before')
clean = clean_it(raw)
snapshot(clean, 'after')

Если количество строк изменилось, что-то было удалено. Если нулевой счетчик обращался к нулю, что-то было заполнено. Если количество уникальных идентификаторов изменилось, идентификаторы были объединены или разделены. Эти три числа описывают большую часть того, что делает сценарий очистки.

Шесть операций и то, что решает каждая из них

1. водянка

df = df.dropna()          # every column, any null, row gone

Оспорить следует версию без аргументов. Он удаляет строку, если любой Столбец имеет значение NULL, включая столбцы, которые ваш анализ никогда не использует. На широкой таблице, из которой можно удалить большую часть данных. Проверьте количество, затем сузьте его: dropna(subset=['amount']) по крайней мере, указано, какой столбец имеет значение.

Более глубокий вопрос заключается в том, что означает отсутствие. Промахнуться случайно – неприятность. Отсутствие, поскольку поле заполнено только для одного типа клиентов, означает удаление группы, и последующий анализ касается другой группы населения, чем та, о которой вас спрашивали.

2. чувствовать

df['amount'] = df['amount'].fillna(0)

Это создает данные. Нуль будет суммирован, усреднен и отображен на графике точно так же, как измеренный ноль, и ничто в дальнейшем не сможет отличить их друг от друга. Заполняйте 0 только в том случае, если отсутствие означает отсутствие. Если «отсутствует» означает «не записано», оставьте это значение и позвольте агрегации пропустить его или заполните дозорным и запишите количество.

Медианное и среднее заполнения несут одно и то же предупреждение, но с более дружелюбным лицом: они уменьшают дисперсию и смещают каждую группу к середине, поэтому любая вычисленная впоследствии мера разброса занижена.

3. замена и сопоставление категорий

df['region'] = df['region'].replace({'Nrth': 'North', 'N': 'North'})

Каждое сопоставление — это утверждение, что две метки означают одно и то же. Обычно верно, иногда нет: N это может быть «Север», «Новый» или «Системное значение по умолчанию». Спросите, откуда взялось картографирование. Если ответ заключается в том, что он был получен на основе сходства, его необходимо сверить с реальным списком литературы. Это предмет Разрешение объекта.

Выведите значения счетчиков до и после. Категория, в которой количество строк увеличивается от 900 до 4000, является либо хорошим, либо плохим слиянием, а именно с числа начинается разговор.

4. Приведение типов

df['id'] = df['id'].astype(int)
df['date'] = pd.to_datetime(df['date'])

Приведение идентификатора к числу безвозвратно уничтожает ведущие нули, а любой идентификатор, длина которого превышает 15 цифр, теряет точность. Синтаксический анализ даты без явного угадывания формата, и классическая ошибка — это файл с первым днем, читаемый как первый с месяца, который автоматически меняет местами значения стиля 3 марта и 1 апреля, ничего не вызывая в дни, превышающие 12.

pd.to_datetime(df['date'], format='%d/%m/%Y', errors='raise')

errors='coerce' стоит внимательно посмотреть, где бы вы его ни увидели: он превращает неразбираемые даты в нули, которые в следующем dropna потом удаляет. Две невинно выглядящие строки и строки с нечетным форматом даты исчезли.

5. удалить_дубликаты

df = df.drop_duplicates(subset=['customer_id'], keep='first')

Какой из них будет первым, полностью зависит от порядка сортировки, и если кадр не был отсортирован намеренно, выживающая строка будет произвольной. Если дубликаты различаются в каком-либо столбце, вы выбрали случайное значение. Выполните явную сортировку по решающему столбцу (обычно это временная метка) и укажите в записи, что побеждает последняя запись.

6. Отсечение и удаление выбросов

df = df[df['amount'] < df['amount'].quantile(0.99)]

Это удаляет верхний один процент по конструкции, независимо от того, являются ли эти строки ошибками. Согласно данным о доходах, верхний процент часто представляет собой наиболее значимых клиентов. Удаление выброса законно только тогда, когда вы можете сказать, что делает его неправильным, а не просто то, что он большой. Видеть процентили и правило выбросов.

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

Обзор в виде таблицы, которую вы заполняете

ШагСтроки передСтроки послеФакт или предположениеВходит в рецензию?
водянка(подмножество=количество)41,20840,955ПредположениеДа, 253 строки
заменить написание региона40,95540,955ПредположениеДа, перечислите сопоставления
drop_duplications по идентификатор заказа40,95540,901Факт, если идентификаторы уникальны по своей природеДа, 54 ряда
дата актерского состава40,90140,901Фактически, формат был явнымНет

Четыре строки таблицы, и в анализе теперь есть раздел о происхождении вместо заявления о том, что данные были очищены.

Как применить это в своей работе

  1. Добавьте функцию моментального снимка в каждый запускаемый вами скрипт очистки, включая короткие.
  2. Никогда не принимайте голого dropna(). Спросите, какой столбец имел значение и сколько строк он стоил.
  3. Бросьте вызов каждому fillna(0) с вопросом: здесь отсутствие означает отсутствие?
  4. Дайте каждому анализу даты явный формат и обработайте errors='coerce' как что-то, чтобы оправдать.
  5. Опубликуйте подсчеты «до» и «после» рядом с результатом. Это самое дешевое доверие, которое вы когда-либо купите.

Единственная привычка, которую нужно сохранить

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

Не могли бы вы сегодня повторно запустить последний сценарий очистки из исходного файла и получить тот же результат?

Показатели в обзорной таблице носят иллюстративный характер. Дело в форме таблицы: четыре столбца, по одной строке на операцию и по каждому записано решение.
Уборка – это не уборка. Каждый шаг — это суждение о том, что означают данные.

Python для аналитиков — это рабочая книга по аналитике pandas: прочитайте файл, исправьте его типы, сгруппируйте его, присоединитесь к нему и проверьте ответ, прежде чем его увидит кто-либо еще.

Python для аналитиков, 19 $ →
Подсчеты - это обзор.

Филна и Дропна подробно описывает решения по недостающим значениям, drop_duplications дедупликационные, и Документирование ограничений данных здесь принадлежат результаты.

Читать филна и дропна →