Назад к промптам
Данные
Средний уровень
Обновлено 13 июля
Очистка и нормализация CSV
Находит проблемы в грязном CSV, задаёт правила нормализации и пишет скрипт очистки.
- Ты — инженер по данным. Проанализируй образец CSV и подготовь его очистку
- до целевой схемы.
- Цели:
- — Найти все проблемы качества данных в образце.
- — Сформулировать правила нормализации по каждой колонке.
- — Написать воспроизводимый скрипт очистки на Python (pandas).
- — Ничего не придумывать: значения, которые нельзя восстановить, помечать.
- Образец CSV (с заголовком):
- {{CSV_SAMPLE}}
- Целевая схема:
- {{TARGET_SCHEMA}}
- Особые правила:
- {{RULES}}
- Локаль и кодировка исходника:
- {{LOCALE}}
- Формат ответа: строго в Markdown, на русском языке.
- Структура ответа:
- 1) Диагностика — список найденных проблем с примерами строк из образца
- 2) Правила нормализации — таблица: колонка, проблема, правило, пример «было → стало»
- 3) Скрипт очистки — Python + pandas, одним блоком кода, с комментариями;
- на выходе clean.csv и rejects.csv (строки, требующие ручного разбора)
- 4) Отчёт — что скрипт напечатает по завершении: счётчики исправлений и отбраковки
- 5) Ручная проверка — какие строки и почему попадут в rejects.csv
- Правила:
- — Пропущенное значение остаётся пустым или уходит в rejects — заполнять
- «похожим» запрещено.
- — Каждое преобразование детерминировано: без «исправить как получится».
- — Дубликаты не удаляй молча: действуй по заданному правилу, иначе — в отчёт.
- — Скрипт не меняет исходный файл, пишет результат в новые файлы.
Скопировано
Переменные
{{CSV_SAMPLE}}
Первые 20–50 строк файла вместе с заголовком — достаточно, чтобы увидеть типовые проблемы.
Обязательная
{{TARGET_SCHEMA}}
Желаемые колонки и типы: name (строка), phone (+7XXXXXXXXXX), date (ГГГГ-ММ-ДД).
Обязательная
{{RULES}}
Особые правила: что делать с дубликатами, чем считать пустое значение. Необязательно.
Необязательная
{{LOCALE}}
Локаль исходных данных: формат дат, десятичный разделитель, кодировка. Необязательно.
Необязательная
Пример структурированного ответа
Пример вывода
1) Диагностика
- Телефоны в трёх форматах:
8 (912) 345-67-89,+79123456789,912-345-67-89(строки 2, 7, 15). - Даты в двух форматах:
03.05.2026и2026/05/03(строки 4, 9). - Пробелы и регистр в ФИО:
иванов пётр,ИВАНОВ ПЕТР(строки 3, 11) — возможные дубликаты. - Десятичная запятая в сумме:
1 200,50вместо1200.50(строка 6). - Пустой email в 4 строках из 50.
2) Правила нормализации
| Колонка | Проблема | Правило | Было → стало |
|---|---|---|---|
| phone | Разные форматы | Убрать всё кроме цифр, 8→+7, 11 цифр обязательно | 8 (912) 345-67-89 → +79123456789 |
| date | Два формата | Парсить оба, приводить к ISO | 03.05.2026 → 2026-05-03 |
| name | Пробелы, регистр | trim, схлопнуть пробелы, Title Case | иванов пётр → Иванов Пётр |
| amount | Запятая, пробелы | Убрать пробелы, запятая → точка, float | 1 200,50 → 1200.50 |
| Пустые | Оставить пустым, счётчик в отчёт | → |
3) Скрипт очистки
import pandas as pd
import re
df = pd.read_csv("input.csv", dtype=str, encoding="utf-8")
def norm_phone(v):
if pd.isna(v):
return None
digits = re.sub(r"\D", "", v)
if len(digits) == 11 and digits[0] in "78":
return "+7" + digits[1:]
return None # не распознали — строка уйдёт в rejects
df["phone"] = df["phone"].map(norm_phone)
df["date"] = pd.to_datetime(df["date"], format="mixed", dayfirst=True,
errors="coerce").dt.strftime("%Y-%m-%d")
df["name"] = (df["name"].str.strip().str.split().str.join(" ").str.title())
df["amount"] = (df["amount"].str.replace(" ", "", regex=False)
.str.replace(",", ".", regex=False)
.astype(float))
bad = df["phone"].isna() | df["date"].isna()
df[bad].to_csv("rejects.csv", index=False)
df[~bad].to_csv("clean.csv", index=False)
print(f"чисто: {(~bad).sum()}, на ручной разбор: {bad.sum()}")
4) Отчёт
чисто: 46, на ручной разбор: 4 плюс счётчики пустых email.
5) Ручная проверка
В rejects.csv попадут строки с нераспознанным телефоном (меньше 11 цифр) и датами, которые не парсятся ни одним форматом, — их восстанавливает владелец данных.