Введение в Pandas и анализ данных
Pandas — ключевой инструмент в экосистеме Python для работы с данными. Разработанная Уэсом Маккини в 2008 году, эта библиотека стала стандартом для data science благодаря скорости, гибкости и мощным функциям.
Pandas идеально подходит для:
Загрузки и сохранения данных в разных форматах
Очистки и подготовки данных
Статистического анализа
Подготовки данных для машинного обучения
Визуализации данных (часто в сочетании с Matplotlib и Seaborn)
В этом руководстве мы подробно рассмотрим Pandas, от базовых операций до сложных техник.
---
1. Основные структуры данных в Pandas
1.1 Series — одномерные данные с метками
Series — это одномерный массив с метками, который может содержать данные любого типа. Метки осей называются индексами.
Создание Series:
import pandas as pd import numpy as np # Из списка s1 = pd.Series([1, 3, 5, np.nan, 6, 8]) # Из словаря s2 = pd.Series({'a': 1, 'b': 2, 'c': 3}) # С указанием индекса s3 = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
Основные операции с Series:
# Арифметические операции s = pd.Series([1, 2, 3, 4, 5]) s + 10 # Добавляет 10 к каждому элементу s * 2 # Умножает каждый элемент на 2 # Фильтрация s[s > 3] # Выбирает элементы больше 3 # Статистические методы s.mean() # Среднее значение s.std() # Стандартное отклонение s.describe() # Основные статистики
1.2 DataFrame — двумерные табличные данные
DataFrame — это двумерная структура с метками строк и столбцов, напоминающая электронную таблицу или SQL-таблицу.
Создание DataFrame:
# Из словаря data = {'Имя': ['Анна', 'Борис', 'Кирилл'], 'Возраст': [25, 30, 35], 'Город': ['Москва', 'Санкт-Петербург', 'Казань']} df = pd.DataFrame(data) # Из списка списков data = [['Анна', 25, 'Москва'], ['Борис', 30, 'Санкт-Петербург'], ['Кирилл', 35, 'Казань']] df = pd.DataFrame(data, columns=['Имя', 'Возраст', 'Город']) # Специальные конструкторы pd.DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C']) # Случайные данные
Основные атрибуты и методы DataFrame:
df.shape # Размерность (строки, столбцы) df.columns # Названия столбцов df.index # Индексы строк df.dtypes # Типы данных столбцов df.head() # Первые 5 строк df.tail(3) # Последние 3 строки df.info() # Информация о DataFrame df.describe() # Статистика по числовым столбцам
---
2. Загрузка и сохранение данных
2.1 Работа с CSV
Чтение CSV:
# Простые случаи df = pd.read_csv('data.csv') # Специальные параметры df = pd.read_csv('data.csv', sep=';', # Разделитель header=0, # Строка заголовков index_col=0, # Столбец для индекса na_values=['NA', 'н/д'], # Обозначения пропусков encoding='utf-8') # Кодировка
Запись в CSV:
df.to_csv('output.csv', index=False, # Не сохранять индексы sep=';', # Разделитель encoding='cp1251') # Кодировка
2.2 Работа с Excel
Чтение Excel:
df = pd.read_excel('data.xlsx', sheet_name='Лист1', header=1, # Заголовок во второй строке usecols='A:D') # Только столбцы A-D
Запись в Excel:
with pd.ExcelWriter('output.xlsx') as writer: df.to_excel(writer, sheet_name='Результаты', index=False) # Можно записать несколько листов df2.to_excel(writer, sheet_name='Дополнительно')
2.3 Другие форматы
Pandas поддерживает множество других форматов данных:
# JSON pd.read_json('data.json') df.to_json('output.json') # SQL import sqlite3 conn = sqlite3.connect('database.db') pd.read_sql('SELECT * FROM table', conn) df.to_sql('new_table', conn) # HTML (парсинг таблиц с веб-страниц) pd.read_html('https://example.com/table.html')[0]
---
3. Основные операции с данными
3.1 Индексация и выбор данных
Выбор столбцов:
df['Имя'] # Один столбец (возвращает Series) df[['Имя', 'Возраст']] # Несколько столбцов (DataFrame)
Выбор строк:
df.loc[0] # По метке индекса df.iloc[0] # По позиции (0 - первая строка) df.loc[1:3] # Срезы по меткам df.iloc[1:3] # Срезы по позициям
Условный выбор:
df[df['Возраст'] > 30] # Простое условие df[(df['Возраст'] > 25) & (df['Город'] == 'Москва')] # Комбинированные условия df.query('Возраст > 25 and Город == "Москва"') # Альтернативный синтаксис
3.2 Обработка пропущенных данных
Обнаружение пропусков:
df.isna() # Булева маска пропусков df.isna().sum() # Количество пропусков по столбцам
Обработка пропусков:
df.dropna() # Удаление строк с пропусками df.fillna(0) # Замена пропусков нулями df.fillna(df.mean()) # Замена средним значением df['Возраст'].interpolate() # Интерполяция
3.3 Преобразование данных
Добавление/удаление столбцов:
df['Новый_столбец'] = df['Возраст'] * 2 # Добавление df.drop('Город', axis=1) # Удаление
Изменение индекса:
df.set_index('Имя') # Установка нового индекса df.reset_index() # Сброс индекса
Применение функций:
df['Возраст'].apply(lambda x: x + 1) # К каждому элементу df.apply(np.mean, axis=0) # По столбцам df.apply(np.mean, axis=1) # По строкам
---
4. Продвинутые техники
4.1 Группировка и агрегация
# Простая группировка grouped = df.groupby('Город') # Множественная группировка df.groupby(['Город', 'Возраст']) # Агрегатные функции df.groupby('Город')['Возраст'].mean() df.groupby('Город').agg({'Возраст': ['mean', 'min', 'max'], 'Имя': 'count'}) # Трансформации (например, z-score) df.groupby('Город')['Возраст'].transform(lambda x: (x - x.mean()) / x.std())
4.2 Объединение данных
# Конкатенация pd.concat([df1, df2], axis=0) # По строкам pd.concat([df1, df2], axis=1) # По столбцам # Соединения (как в SQL) pd.merge(df1, df2, on='ключ') # INNER JOIN pd.merge(df1, df2, on='ключ', how='left') # LEFT JOIN
4.3 Временные ряды
# Преобразование в DateTime df['Дата'] = pd.to_datetime(df['Дата']) # Ресемплинг временных рядов df.set_index('Дата').resample('M').mean() # По месяцам # Скользящие окна df['Возраст'].rolling(window=3).mean() # Скользящее среднее
---
5. Оптимизация производительности
5.1 Векторизация операций
Избегайте циклов — используйте встроенные методы Pandas:
# Плохо (медленно) for i in range(len(df)): df.loc[i, 'Новый_столбец'] = df.loc[i, 'Возраст'] * 2 # Хорошо (быстро) df['Новый_столбец'] = df['Возраст'] * 2
5.2 Использование категориальных данных
Для столбцов с небольшим числом уникальных значений используйте категориальные данные:
df['Город'] = df['Город'].astype('category')
5.3 Методы eval() и query()
Для сложных операций используйте eval() и query():
df.eval('Новый_столбец = (Возраст * 2) / (Рост + 1)', inplace=True)
---
Заключение
Pandas — мощный инструмент для анализа данных в Python. В этом руководстве мы рассмотрели:
Основные структуры данных (Series и DataFrame)
Методы загрузки и сохранения данных
Техники очистки и преобразования данных
Продвинутые методы группировки и агрегации
Оптимизацию производительности
Для дальнейшего изучения рекомендуем:
Официальную документацию Pandas
Практические задачи на Kaggle
Специализированные курсы по анализу данных
Освоив Pandas, вы сможете решать большинство задач анализа данных быстро и эффективно.
https://ivan-vorsin.ru/polnoe-rukovodstvo-po-analizu-dannyh-s-pandas-ot-osnov-do-prodvinutyh-tehnik/