Советы по очистке данных CSV для аналитиков и разработчиков
CSV-файлы — универсальный формат обмена табличными данными. Они просты, человекочитаемы и поддерживаются каждым инструментом от Excel до pandas. Но реальные CSV-файлы часто бывают грязными — несогласованные кодировки, пропущенные значения, смешанные типы данных и некорректные строки. Это руководство охватывает практические методы надёжной очистки данных CSV.
Распространённые проблемы CSV
1. Проблемы с кодировкой
Самая раздражающая проблема CSV — кодировка. Файл, созданный в Windows в Excel, может использовать windows-1252, тогда как ваш Python-скрипт ожидает utf-8.
Симптомы: Искажённые символы (мохибаке) вроде é вместо é, или исключения UnicodeDecodeError.
Обнаружение:
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Исправление: Прочитайте файл с обнаруженной кодировкой, затем сохраните в UTF-8:
import pandas as pd
df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)
2. Несогласованные разделители
Не все «CSV» используют запятые. Европейские CSV-файлы часто используют точку с запятой, потому что запятые являются десятичными разделителями во многих европейских локалях.
# Автоопределение разделителя
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Разделитель: {repr(dialect.delimiter)}")
Наш CSV Редактор автоматически определяет разделители — вставьте данные, и он определит формат.
3. Пропущенные значения
Отсутствующие данные принимают множество форм: пустые ячейки, NA, N/A, null, - или просто пробелы.
# Стандартизация всех представлений пропущенных значений
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Проверка пропущенных значений по столбцам
print(df.isnull().sum())
# Стратегия 1: Удалить строки с отсутствующими критическими полями
df = df.dropna(subset=['email', 'name'])
# Стратегия 2: Заполнить значениями по умолчанию
df['country'] = df['country'].fillna('Unknown')
# Стратегия 3: Прямое заполнение (временные ряды)
df['price'] = df['price'].ffill()
4. Дублирующиеся строки
Точные дубликаты легко найти. Нечёткие дубликаты (один и тот же человек с немного отличающимся написанием имени) — сложнее.
# Поиск точных дубликатов
duplicates = df[df.duplicated(keep=False)]
print(f"Найдено {len(duplicates)} дублирующихся строк")
# Удаление дубликатов, сохраняя первое вхождение
df = df.drop_duplicates()
# Удаление дубликатов по определённым столбцам
df = df.drop_duplicates(subset=['email'], keep='last')
5. Несогласованные форматы данных
Даты в разных форматах, телефонные номера с кодами стран и без, непоследовательная капитализация:
# Стандартизация дат
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Стандартизация текстовых полей
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Стандартизация телефонных номеров (базовая)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. Проблемы с типами данных
CSV хранит всё как текст. Числа с ведущими нулями, почтовые индексы и телефонные номера могут потерять форматирование при парсинге:
# Сохранение ведущих нулей в почтовых индексах
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Преобразование строк с валютой в числа
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Валидация после очистки
Всегда проверяйте очищенные данные:
# Проверка количества строк (не потеряли и не получили строки неожиданно?)
print(f"Строк: {len(df)}")
# Проверка типов данных
print(df.dtypes)
# Проверка диапазонов значений
print(df.describe())
# Проверка оставшихся null-значений
print(df.isnull().sum())
# Валидация уникальных ограничений
assert df['email'].is_unique, "Найдены дублирующиеся email!"
Инструменты командной строки
Для быстрой очистки без написания кода:
# Конвертация кодировки
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Сортировка и удаление дублирующихся строк
sort -u input.csv > output.csv
# Извлечение определённых столбцов (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Фильтрация строк (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Для более сложных преобразований инструменты вроде csvkit предоставляют полный набор утилит для CSV:
# Установка
pip install csvkit
# Просмотр названий столбцов
csvcut -n data.csv
# Фильтрация строк
csvgrep -c country -m "USA" data.csv > usa_only.csv
# Конвертация в JSON
csvjson data.csv > data.json
Конвертируете между CSV и JSON? Наш конвертер CSV в JSON делает это мгновенно.
FAQ
Каков максимальный размер файла для обработки CSV?
В самом формате CSV нет встроенного ограничения. Практический предел зависит от ваших инструментов: Excel обрабатывает около 1 миллиона строк, pandas хорошо работает до нескольких ГБ при достаточном объёме RAM, а инструменты вроде Dask или Polars обрабатывают наборы данных, превышающие объём памяти. Для браузерных инструментов наш CSV-редактор обрабатывает файлы до 100 МБ.
Что лучше использовать для обмена данными — CSV или JSON?
CSV лучше подходит для плоских табличных данных (электронные таблицы, экспорт из баз данных, простые списки). JSON лучше для вложенных, иерархических данных (ответы API, конфигурации, документы с переменной структурой). Подробное сравнение смотрите в нашем руководстве CSV vs JSON vs XML.
Связанные ресурсы
- CSV Редактор — Редактируйте и очищайте CSV-данные в браузере
- Руководство по конвертации CSV в JSON — Конвертация между форматами
- Лучшие практики форматирования JSON — Работа с JSON-результатом