Перейти к основному содержимому

Очистка и подготовка данных в Pandas

Аналитику Разработчику

Назначение

Краткая напоминалка по библиотеке pandas для этапа data cleaning — приведения сырой таблицы к виду, пригодному для описательной статистики, визуализации и моделей. Команды сгруппированы по типичному порядку работы: сначала осмотр, затем пропуски и дубликаты, правка столбцов, отбор строк, объединение и агрегация.

Предполагается, что DataFrame уже загружен (pd.read_csv и другие read_* — в типовых операциях Pandas и напоминалке по четырём инструментам). Разбор идей импутации и группировки подробнее — в главе про pandas и NumPy.

Соглашения в таблицах

df — объект DataFrame, col — имя столбца, value — число или строка в условии. Для цепочки операций удобно писать df = df.dropna() или собирать шаги в одну цепочку с .pipe().

Пропуски, дубликаты и замена значений

ЗадачаКомандаКомментарий
Счёт пропусков по столбцамdf.isnull().sum()То же через df.isna().sum()
Удалить строки с пропускамиdf.dropna()subset=['col'] — только по выбранным столбцам; how='all' — строка целиком пустая
Заполнить вперёд по столбцуdf['col'].ffill()Для всей таблицы: df.ffill(); раньше использовали fillna(method='ffill') — в pandas 2.x лучше ffill()
Заполнить константой или медианойdf['col'].fillna(0)df.fillna({'col': df['col'].median()}) — разные правила по столбцам
Удалить дубликаты строкdf.drop_duplicates()subset=['col'], `keep='first'
Заменить отдельные значенияdf.replace({'old': 'new'})Для нескольких пар: df.replace({'a': 1, 'b': 2})

Перед массовым dropna() имеет смысл оценить долю потерь: иначе выборка станет нерепрезентативной. Заполнение пропусков — это гипотеза о данных; её стоит зафиксировать в ноутбуке или отчёте.


Осмотр и понимание таблицы

ЗадачаКомандаКомментарий
Первые строкиdf.head()По умолчанию 5 строк; df.head(10)
Типы и число непустых значенийdf.info()Память, dtype, non-null по каждому столбцу
Сводная статистика по числамdf.describe()Среднее, std, квантили; для категорий — df.describe(include='object')
Размерdf.shapeКортеж (строки, столбцы)
Частоты категорииdf['col'].value_counts()normalize=True — доли, dropna=False — учесть пропуски

Типичный старт после загрузки CSV: df.head(), df.info(), df.describe() — так быстро видно «грязные» имена столбцов, неверные типы и выбросы.


Имена столбцов, типы, удаление лишнего

ЗадачаКомандаКомментарий
Переименовать столбцыdf.rename(columns={'old': 'new'})inplace=True меняет объект на месте (чаще предпочитают присваивание без inplace)
Привести типыdf.astype({'col': 'int64'})Даты: pd.to_datetime(df['col']); категории: df['col'].astype('category')
Удалить столбцыdf.drop(['col'], axis=1)Несколько имён в списке; то же: columns=['col']
Сбросить индекс строкdf.reset_index(drop=True)drop=True не оставляет старый индекс отдельным столбцом
Убрать пробелы в названияхdf.columns = df.columns.str.strip()Часто добавляют .str.lower() для единого стиля

Если столбец с ID читается как число и теряет ведущие нули — задайте тип при загрузке: pd.read_csv(..., dtype={'id': str}).


Фильтрация и выбор строк

ЗадачаКомандаКомментарий
Условие по столбцуdf.loc[df['col'] > value]Для равенства строк: df.loc[df['col'] == 'yes']
Срез по позиции строкdf.iloc[0:5]iloc — по номеру строки/столбца, без учёта меток индекса
Значение из спискаdf[df['col'].isin(['val1', 'val2'])]Удобно для кодов статусов и регионов
Выражение-строкаdf.query('col > 10 and col2 == "yes"')Имена столбцов с пробелами — в обратных кавычках

При нескольких условиях в квадратных скобках используйте &, |, ~ и скобки: df[(df['a'] > 0) & (df['b'] == 'x')]. Подробнее про булевы маски — в разделе про фильтрацию.


Объединение таблиц и агрегация

ЗадачаКомандаКомментарий
Сложить строки (одинаковые столбцы)pd.concat([df1, df2], axis=0)ignore_index=True — новая нумерация строк
Соединить по ключуpd.merge(df1, df2, on='key')`how='left'
Группировка и агрегатdf.groupby('col').agg({'val': 'mean'})Несколько функций: .agg({'val': ['mean', 'sum']})
Частоты значенийdf['col'].value_counts()Дублирует осмотр, но удобно перед отбором редких категорий

Сравнение merge, concat и groupby с Polars, SQL и PySpark426. Своды и pivot — объединение таблиц в Pandas.


Мини-пайплайн перед аналитикой

Пример последовательности в ноутбуке (имена столбцов замените на свои):

import pandas as pd

df = pd.read_csv("data.csv")
df.columns = df.columns.str.strip()

print(df.isnull().sum())
print(df.describe())

df = df.drop_duplicates()
df = df.dropna(subset=["id", "date"])
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")

summary = df.groupby("region")["amount"].agg(["mean", "count"])

Дальше — визуализация (df.plot, Seaborn) и модели (scikit-learn); см. Python для анализа и практический маршрут.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").