🔍 Первичный осмотр данных в Pandas
После загрузки данных в DataFrame важно убедиться, что файл отображается правильно (не съехали столбцы, правильный разделитель, верная кодировка). Стандартное превью — достаточно неудобное и затратное по ресурсам. Здесь опишу базовые практики.
☄️ Методы для быстрого анализа
df.head() # первые 5 строк
df.tail(3) # последние 3 строки
df.shape # размер (строки, столбцы)
df.info() # типы столбцов, количество не‑NaN, память
df.columns # имена колонок (фичей)🚩 Заголовки / header
Важно правильно указать, где находятся заголовки. Говорим системе:
- header=0 (по умолчанию) — первая строка становится именами колонок
- header=None — в файле нет строки-заголовка (колонки получат имена 0,1,2...)
- header=1 — заголовки лежат во второй строке, первая — служебная/мусорная
- names=['a','b','c'] — передаём явно имена колонок
- skiprows=[0,2,5] — пропустить строки с номерами 0,2,5 (мусорные)
- skipfooter=2 — пропустить последние 2 строки (требует engine='python', потому что стандартный C-движок не умеет читать файл с конца):
pd.read_csv('file.csv', skipfooter=2, engine='python')📊 Какие столбцы загружать
- usecols=['id','price'] — читать только указанные столбцы (экономит память)
- nrows=1000 — прочитать только первые 1000 строк (удобно для теста)
# Прочитай только столбцы 'id' и 'price'
pd.read_csv('file.csv', usecols=['id', 'price'])
# Только первые 1000 строк
pd.read_csv('file.csv', nrows=1000)
# Комбинация
pd.read_csv('file.csv', usecols=['id', 'price'], nrows=1000)☝️ Проверка пропущенных значений (NaN)
NaN — «дырка» в данных, если не проверить:
- базовые агрегаты выдадут NaN
- модели машинного обучения выдадут ошибку
- графики могут исказиться
df.isna().sum() # сколько NaN в каждом столбце (часто используют вместе/вместо с info)
df.isna().sum().sum() # общее число NaN во всей таблице🧷 Типы данных
Pandas различает только три основных типа:
- Числовые (int64, float64)
- Булевы (bool)
- Объекты (object) — строки, смешанные типы, даты*, списки и т.д.
*Для работы с датами лучше использовать datetime64, но при первичном осмотре они тоже попадут в object, если не преобразовать.
Типы столбцов можно задать сразу при чтении (через `dtype`) или поменять после (через `astype()`):
• dtype экономит память и время при загрузке больших файлов
• astype даёт гибкость при постобработке
# Задать типы столбцов сразу при чтении — ускоряет чтение
df = pd.read_csv('file.csv', dtype={'id': int, 'price': float})
# Посмотреть типы всех столбцов
df.dtypes
# Поменять тип после загрузки (пример)
df = pd.read_csv('file.csv')
df['price'] = df['price'].astype(float)📦 Доступ к столбцу
Предпочтительно через квадратные скобки.
df['cost'] # ✅ работает всегда
df.cost # ⚠️ не работает с пробелами, спецсимволами, может совпасть с методом DataFrame📊 Описательные статистики / descriptive statistics
Один из ключевых методов разведочного анализа данных (EDA).
1. Функция для числовых данных — describe():
- count – сколько непустых значений
- mean – среднее арифметическое
- std – стандартное отклонение (разброс данных)
- min – минимум
- 25%, 50%, 75% – квантили (границы, ниже которых лежат 25%, 50%, 75% данных)
- max – максимум
df.describe()2. Для текстовых (категориальных) столбцов — include=['object']:
df.describe(include=['object'])Покажет: количество уникальных значений, самую частую категорию (top), её частоту (freq).
9️⃣ Подсчёт частот значений / frequency counts
Применяется к одному столбцу (Series), считает, сколько раз встречается каждое значение.
df['channel'].value_counts() # абсолютные значения
# ya 99
# vk 1`normalize=True` — доли (относительные частоты), помогает выявить дисбаланс данных:
df['channel'].value_counts(normalize=True) # доли
# ya 0.99
# vk 0.01Если одна категория встречается гораздо чаще других, модель будет плохо предсказывать редкие классы.
💬 Далее:
Pandas. Меняем размер таблицы — добавляем и удаляем данные