alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

Советы по очистке данных 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.

Связанные ресурсы

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one