Вот практический пайплайн который можно переиспользовать в любом проекте.
🔍 1. Инспекция до чистки
print(df.shape)
print(df.dtypes)
print(df.duplicated().sum())
df.isna().sum()
Сначала смотрим, потом чистим.
📋 2. Имена колонок
df.columns = (
df.columns
.str.strip()
.str.lower()
.str.replace(r"\s+", "_", regex=True)
)
🔲 3. Пустые строки и плейсхолдеры → NaN
df = df.replace(r"^\s*$", pd.NA, regex=True)
df = df.replace(["N/A", "n/a", "unknown", "not a date"], pd.NA)
🔤 4. Текстовые колонки
df["full_name"] = df["full_name"].str.strip().str.title()
df["email_address"] = df["email_address"].str.lower()
df["membership"] = df["membership"].str.lower()
✅ 5. Валидация категорий
allowed = {"bronze", "silver", "gold"}
df.loc[~df["membership"].isin(allowed), "membership"] = pd.NA
🔢 6. Числа и даты
df["age"] = pd.to_numeric(df["age"], errors="coerce")
df.loc[~df["age"].between(0, 120), "age"] = pd.NA
df["join_date"] = pd.to_datetime(df["join_date"], format="mixed", errors="coerce")
df["total_spend"] = (
df["total_spend"].astype("string")
.str.replace(r"[^0-9.-]", "", regex=True)
)
df["total_spend"] = pd.to_numeric(df["total_spend"], errors="coerce")
📧 7. Валидация email
pattern = r"^[^\s@]+@[^\s@]+\.[^\s@]+$"
df.loc[~df["email_address"].str.match(pattern, na=False), "email_address"] = pd.NA
🧩 8. Обработка пропусков
df = df.dropna(subset=["customer_id"]) # обязательное поле
df["age"] = df["age"].fillna(df["age"].median())
df["membership"] = df["membership"].fillna("unassigned")
🛡 9. Финальная валидация через assert
assert df["customer_id"].notna().all()
assert df["customer_id"].is_unique
assert df["age"].between(0, 120).all()
assert df["total_spend"].ge(0).all()
Если все проверки прошли — данные готовы к анализу.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека дата-сайентиста
#буст
