Pandas – обработка и анализ данных

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Pandas — это фундаментальная библиотека для анализа данных в Python, которая стала стандартом индустрии для обработки структурированной информации. Созданная Уэсом МакКинни в 2008 году, она получила свое название от термина "Panel Data" — панельные данные в эконометрике.

Что такое Pandas и почему он так важен

Pandas представляет собой мощную open-source библиотеку, построенную на основе NumPy, которая предоставляет высокоуровневые структуры данных и инструменты для быстрого и эффективного анализа данных. Библиотека особенно эффективна при работе с табличными данными, временными рядами и любой структурированной информацией.

Ключевые преимущества Pandas:

Универсальность: Pandas поддерживает работу с различными форматами данных — от CSV и Excel до JSON, SQL, HTML и многих других.

Производительность: Благодаря оптимизированным алгоритмам на основе Cython и NumPy, библиотека обеспечивает высокую скорость обработки больших объемов данных.

Интуитивность: Синтаксис библиотеки максимально приближен к естественному языку, что делает код понятным и легким для изучения.

Интеграция: Pandas отлично интегрируется с другими библиотеками экосистемы Python — NumPy, Matplotlib, Scikit-learn, SciPy.

Области применения Pandas:

  • Анализ и визуализация данных — создание отчетов, дашбордов, исследовательский анализ
  • Машинное обучение — предобработка данных, feature engineering, подготовка датасетов
  • Финансовая аналитика — анализ временных рядов, расчет финансовых показателей
  • Бизнес-аналитика — подготовка отчетов, анализ продаж, KPI
  • Научные исследования — обработка экспериментальных данных, статистический анализ
  • Веб-скрапинг — структурирование и очистка собранных данных

Установка и подключение Pandas

Установка через pip:

pip install pandas

Установка через conda:

conda install pandas

Подключение библиотеки:

import pandas as pd
import numpy as np  # часто используется вместе с pandas

Сокращение pd стало универсальным стандартом в сообществе Python и используется во всех руководствах и документации.

Основные структуры данных: Series и DataFrame

Series — одномерные данные с индексами

Series представляет собой одномерный массив с метками (индексами), который может содержать любые типы данных: числа, строки, логические значения, объекты Python.

# Создание Series из списка
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])

# Создание Series из словаря
data = {'Москва': 12500000, 'Санкт-Петербург': 5400000, 'Новосибирск': 1600000}
population = pd.Series(data)

# Доступ к элементам
print(population['Москва'])  # 12500000
print(population.iloc[0])    # первый элемент

DataFrame — двумерные табличные данные

DataFrame — это двумерная структура данных с метками строк и столбцов, аналогичная таблице в реляционной базе данных или листу Excel.

# Создание DataFrame из словаря
data = {
    'Имя': ['Анна', 'Борис', 'Вика', 'Дмитрий'],
    'Возраст': [25, 30, 22, 28],
    'Город': ['Москва', 'СПб', 'Казань', 'Москва'],
    'Зарплата': [80000, 95000, 60000, 75000]
}
df = pd.DataFrame(data)

# Создание DataFrame с пользовательским индексом
df = pd.DataFrame(data, index=['emp1', 'emp2', 'emp3', 'emp4'])

Загрузка и сохранение данных

Загрузка из различных форматов

# CSV файлы
df_csv = pd.read_csv('data.csv', encoding='utf-8', sep=',')

# Excel файлы
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# JSON файлы
df_json = pd.read_json('data.json')

# SQL базы данных
import sqlite3
conn = sqlite3.connect('database.db')
df_sql = pd.read_sql('SELECT * FROM table_name', conn)

# HTML таблицы
df_html = pd.read_html('https://example.com/table')

# Parquet файлы (для больших данных)
df_parquet = pd.read_parquet('data.parquet')

Дополнительные параметры загрузки

# CSV с параметрами
df = pd.read_csv('data.csv', 
                 sep=';',           # разделитель
                 header=0,          # строка с заголовками
                 index_col=0,       # столбец для индекса
                 parse_dates=True,  # автоматическое преобразование дат
                 na_values=['N/A', 'NULL'])  # значения для NaN

Сохранение данных

# Сохранение в CSV
df.to_csv('output.csv', index=False, encoding='utf-8')

# Сохранение в Excel
df.to_excel('output.xlsx', sheet_name='Данные', index=False)

# Сохранение в JSON
df.to_json('output.json', orient='records', force_ascii=False)

# Сохранение в SQL
df.to_sql('table_name', conn, if_exists='replace', index=False)

Индексация, фильтрация и выбор данных

Выбор столбцов

# Один столбец
names = df['Имя']

# Несколько столбцов
subset = df[['Имя', 'Возраст']]

# Все столбцы кроме указанных
df_without_salary = df.drop('Зарплата', axis=1)

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

# Логическая фильтрация
young_employees = df[df['Возраст'] < 30]

# Множественные условия
moscow_young = df[(df['Город'] == 'Москва') & (df['Возраст'] < 30)]

# Использование метода query
high_salary = df.query('Зарплата > 70000')

# Фильтрация по списку значений
moscow_spb = df[df['Город'].isin(['Москва', 'СПб'])]

Индексация loc и iloc

# loc - по меткам
df.loc[0, 'Имя']                    # конкретная ячейка
df.loc[0:2, ['Имя', 'Возраст']]     # диапазон строк и столбцов
df.loc[df['Возраст'] > 25, 'Зарплата'] = 100000  # условное присваивание

# iloc - по позициям
df.iloc[0, 1]                       # первая строка, второй столбец
df.iloc[1:3, 0:2]                   # срез по позициям
df.iloc[-1]                         # последняя строка

Работа с пропущенными значениями

Обнаружение пропусков

# Проверка на пропуски
df.isnull()                         # булева маска
df.isnull().sum()                   # количество пропусков по столбцам
df.info()                           # общая информация о пропусках

Обработка пропусков

# Удаление строк с пропусками
df.dropna()                         # удалить все строки с NaN
df.dropna(subset=['Имя'])           # удалить строки с NaN в столбце 'Имя'
df.dropna(thresh=2)                 # оставить строки с минимум 2 непустыми значениями

# Заполнение пропусков
df.fillna(0)                        # заполнить нулями
df.fillna(method='ffill')           # заполнить предыдущим значением
df.fillna(method='bfill')           # заполнить следующим значением
df.fillna(df.mean())                # заполнить средним значением

Группировка и агрегирование данных

Группировка с groupby

# Простая группировка
city_groups = df.groupby('Город')

# Агрегация по группам
average_salary_by_city = df.groupby('Город')['Зарплата'].mean()

# Множественная группировка
df.groupby(['Город', 'Возраст'])['Зарплата'].sum()

# Множественные агрегации
df.groupby('Город').agg({
    'Зарплата': ['mean', 'max', 'min'],
    'Возраст': 'mean'
})

Сводные таблицы

# Создание сводной таблицы
pivot_table = df.pivot_table(
    values='Зарплата',
    index='Город',
    columns='Возраст',
    aggfunc='mean'
)

# Более сложная сводная таблица
pivot_complex = df.pivot_table(
    values=['Зарплата', 'Возраст'],
    index='Город',
    aggfunc={'Зарплата': 'mean', 'Возраст': 'count'}
)

Слияние, объединение и соединение таблиц

Методы объединения

# Вертикальное объединение (concat)
df_combined = pd.concat([df1, df2], ignore_index=True)

# Горизонтальное объединение
df_wide = pd.concat([df1, df2], axis=1)

# Слияние по ключам (merge)
df_merged = pd.merge(df1, df2, on='ID', how='inner')

# Различные типы соединений
left_join = pd.merge(df1, df2, on='ID', how='left')
right_join = pd.merge(df1, df2, on='ID', how='right')
outer_join = pd.merge(df1, df2, on='ID', how='outer')

# Соединение по индексам
df_joined = df1.join(df2, how='left')

Изменение и очистка данных

Преобразование данных

# Переименование столбцов
df.rename(columns={'Имя': 'ФИО', 'Возраст': 'Age'}, inplace=True)

# Замена значений
df.replace('Москва', 'Moscow', inplace=True)
df.replace({'Город': {'СПб': 'Санкт-Петербург'}}, inplace=True)

# Преобразование типов данных
df['Возраст'] = df['Возраст'].astype('int64')
df['Дата'] = pd.to_datetime(df['Дата'])

# Применение функций
df['Имя_верхний'] = df['Имя'].str.upper()
df['Зарплата_тыс'] = df['Зарплата'] / 1000

Работа со строками

# Строковые операции
df['Имя'].str.len()                 # длина строки
df['Имя'].str.contains('Ан')        # содержит подстроку
df['Имя'].str.extract('([А-Я])')    # извлечение по регулярному выражению
df['Имя'].str.split(' ')            # разделение строки

Работа с временными рядами

# Создание временного индекса
dates = pd.date_range('2023-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100), index=dates)

# Ресэмплинг (изменение частоты)
monthly = ts.resample('M').mean()   # по месяцам
weekly = ts.resample('W').sum()     # по неделям

# Временные сдвиги
ts.shift(1)                         # сдвиг на один период
ts.shift(-1)                        # сдвиг назад

# Скользящие окна
rolling_mean = ts.rolling(window=7).mean()  # скользящее среднее

Визуализация данных с Pandas

import matplotlib.pyplot as plt

# Простые графики
df['Возраст'].plot(kind='hist', bins=10)
df['Зарплата'].plot(kind='box')
df.plot(x='Возраст', y='Зарплата', kind='scatter')

# Группировка и визуализация
df.groupby('Город')['Зарплата'].mean().plot(kind='bar')

# Временные ряды
ts.plot()
plt.show()

Полная таблица методов и функций Pandas

Категория Функция/Метод Описание Пример использования
Создание данных pd.Series() Создание одномерного массива pd.Series([1,2,3])
  pd.DataFrame() Создание таблицы pd.DataFrame({'A': [1,2,3]})
  pd.read_csv() Загрузка CSV pd.read_csv('file.csv')
  pd.read_excel() Загрузка Excel pd.read_excel('file.xlsx')
  pd.read_json() Загрузка JSON pd.read_json('file.json')
  pd.read_sql() Загрузка из SQL pd.read_sql(query, connection)
  pd.read_html() Загрузка HTML таблиц pd.read_html('url')
  pd.read_parquet() Загрузка Parquet pd.read_parquet('file.parquet')
Просмотр данных df.head() Первые n строк df.head(10)
  df.tail() Последние n строк df.tail(5)
  df.info() Информация о данных df.info()
  df.describe() Описательная статистика df.describe()
  df.shape Размерность df.shape
  df.columns Названия столбцов df.columns
  df.index Индекс df.index
  df.dtypes Типы данных df.dtypes
  df.values Значения как numpy array df.values
  df.sample() Случайная выборка df.sample(n=10)
Индексация df[col] Выбор столбца df['name']
  df[[cols]] Выбор столбцов df[['name', 'age']]
  df.loc[] Выбор по меткам df.loc[0, 'name']
  df.iloc[] Выбор по позициям df.iloc[0, 1]
  df.at[] Скалярный доступ по меткам df.at[0, 'name']
  df.iat[] Скалярный доступ по позициям df.iat[0, 1]
  df.query() Фильтрация по выражению df.query('age > 25')
Фильтрация df[condition] Булева фильтрация df[df['age'] > 25]
  df.where() Условное присваивание df.where(df > 0, 0)
  df.mask() Обратная условная фильтрация df.mask(df < 0)
  df.isin() Проверка вхождения df['city'].isin(['Moscow'])
  df.between() Проверка диапазона df['age'].between(20, 30)
Изменение структуры df.set_index() Установка индекса df.set_index('name')
  df.reset_index() Сброс индекса df.reset_index()
  df.rename() Переименование df.rename(columns={'old': 'new'})
  df.reindex() Переиндексация df.reindex(['a', 'b', 'c'])
  df.sort_values() Сортировка по значениям df.sort_values('age')
  df.sort_index() Сортировка по индексу df.sort_index()
  df.transpose() / df.T Транспонирование df.T
Изменение данных df.drop() Удаление строк/столбцов df.drop('column', axis=1)
  df.drop_duplicates() Удаление дубликатов df.drop_duplicates()
  df.assign() Добавление столбцов df.assign(new_col=lambda x: x['a'] + x['b'])
  df.insert() Вставка столбца df.insert(0, 'new_col', values)
  df.replace() Замена значений df.replace('old', 'new')
  df.fillna() Заполнение пропусков df.fillna(0)
  df.dropna() Удаление пропусков df.dropna()
Применение функций df.apply() Применение функции df.apply(lambda x: x.max() - x.min())
  df.applymap() Применение к каждому элементу df.applymap(lambda x: x.upper())
  df.map() Применение к Series df['col'].map(lambda x: x * 2)
  df.pipe() Применение функции к DataFrame df.pipe(func)
Агрегация df.sum() Сумма df.sum()
  df.mean() Среднее df.mean()
  df.median() Медиана df.median()
  df.min() / df.max() Минимум/максимум df.min()
  df.std() Стандартное отклонение df.std()
  df.var() Дисперсия df.var()
  df.count() Количество непустых df.count()
  df.nunique() Количество уникальных df.nunique()
  df.value_counts() Подсчет значений df['col'].value_counts()
  df.agg() Множественная агрегация df.agg(['sum', 'mean'])
Группировка df.groupby() Группировка df.groupby('city')
  df.pivot() Простая сводная таблица df.pivot(index='A', columns='B', values='C')
  df.pivot_table() Сводная таблица с агрегацией df.pivot_table(values='C', index='A', columns='B', aggfunc='mean')
  df.crosstab() Кросс-таблица pd.crosstab(df['A'], df['B'])
Объединение pd.concat() Конкатенация pd.concat([df1, df2])
  df.merge() Слияние df1.merge(df2, on='key')
  df.join() Присоединение df1.join(df2)
  df.append() Добавление строк df1.append(df2)
Изменение формы df.melt() Преобразование в длинный формат df.melt(id_vars=['A'], value_vars=['B', 'C'])
  df.stack() Преобразование столбцов в строки df.stack()
  df.unstack() Преобразование строк в столбцы df.unstack()
  df.explode() Разворачивание списков df.explode('col_with_lists')
Обработка пропусков df.isna() / df.isnull() Проверка на пропуски df.isna()
  df.notna() / df.notnull() Проверка на непропуски df.notna()
  df.fillna() Заполнение пропусков df.fillna(method='ffill')
  df.dropna() Удаление пропусков df.dropna(axis=1)
  df.interpolate() Интерполяция df.interpolate()
Временные ряды pd.to_datetime() Преобразование в datetime pd.to_datetime(df['date'])
  pd.date_range() Создание диапазона дат pd.date_range('2020-01-01', periods=10)
  df.resample() Ресэмплинг df.resample('M').mean()
  df.shift() Сдвиг во времени df.shift(1)
  df.rolling() Скользящие окна df.rolling(window=3).mean()
  df.expanding() Расширяющиеся окна df.expanding().sum()
Работа со строками df.str.len() Длина строки df['name'].str.len()
  df.str.upper() / df.str.lower() Регистр df['name'].str.upper()
  df.str.contains() Содержит подстроку df['name'].str.contains('John')
  df.str.replace() Замена в строке df['name'].str.replace('old', 'new')
  df.str.split() Разделение строки df['name'].str.split(' ')
  df.str.extract() Извлечение по regex df['name'].str.extract('([A-Z]+)')
  df.str.strip() Удаление пробелов df['name'].str.strip()
Сохранение df.to_csv() Сохранение в CSV df.to_csv('file.csv')
  df.to_excel() Сохранение в Excel df.to_excel('file.xlsx')
  df.to_json() Сохранение в JSON df.to_json('file.json')
  df.to_sql() Сохранение в SQL df.to_sql('table', connection)
  df.to_html() Сохранение в HTML df.to_html('file.html')
  df.to_parquet() Сохранение в Parquet df.to_parquet('file.parquet')
Визуализация df.plot() Базовый график df.plot()
  df.plot.line() Линейный график df.plot.line()
  df.plot.bar() Столбчатая диаграмма df.plot.bar()
  df.plot.hist() Гистограмма df.plot.hist()
  df.plot.box() Ящик с усами df.plot.box()
  df.plot.scatter() Диаграмма рассеяния df.plot.scatter(x='A', y='B')
Дополнительные df.copy() Копирование df.copy()
  df.equals() Сравнение DataFrame df1.equals(df2)
  df.memory_usage() Использование памяти df.memory_usage()
  df.select_dtypes() Выбор по типам данных df.select_dtypes(include=['number'])
  df.convert_dtypes() Автоматическое преобразование типов df.convert_dtypes()

Оптимизация производительности

Советы по ускорению работы с Pandas:

  1. Используйте векторизованные операции вместо циклов
  2. Применяйте метод query() для сложных фильтров
  3. Используйте categorical тип для строковых данных с повторяющимися значениями
  4. Читайте данные частями при работе с большими файлами
  5. Используйте inplace=True для операций изменения данных
# Оптимизированное чтение больших файлов
chunk_size = 10000
chunks = []
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    chunks.append(chunk)
df = pd.concat(chunks, ignore_index=True)

# Использование категориальных данных
df['category'] = df['category'].astype('category')

Часто задаваемые вопросы

Что такое Pandas? Pandas — это библиотека Python для анализа и манипулирования структурированными данными. Она предоставляет мощные инструменты для работы с таблицами, временными рядами и другими формами данных.

В чем разница между Series и DataFrame? Series — это одномерная структура данных (как столбец в таблице), а DataFrame — двумерная структура (полная таблица с несколькими столбцами).

Как загрузить Excel-файл с несколькими листами?

# Загрузка всех листов
all_sheets = pd.read_excel('file.xlsx', sheet_name=None)

# Загрузка конкретного листа
df = pd.read_excel('file.xlsx', sheet_name='Sheet2')

Как объединить несколько CSV-файлов?

import glob

files = glob.glob('*.csv')
dfs = [pd.read_csv(file) for file in files]
combined = pd.concat(dfs, ignore_index=True)

Как работать с большими файлами, которые не помещаются в память?

# Чтение частями
for chunk in pd.read_csv('large_file.csv', chunksize=10000):
    # Обработка каждого чанка
    process_chunk(chunk)

Как ускорить работу с Pandas?

  • Используйте векторизованные операции
  • Применяйте правильные типы данных
  • Используйте query() для фильтрации
  • Избегайте циклов
  • Используйте inplace=True для экономии памяти

Заключение: почему Pandas незаменим в работе с данными

Pandas стала неотъемлемой частью экосистемы Python для работы с данными благодаря своей универсальности, производительности и простоте использования. Библиотека предоставляет интуитивный интерфейс для решения самых разнообразных задач — от простой загрузки CSV-файла до сложного анализа временных рядов.

Основные причины популярности Pandas:

  • Богатый функционал: более 200 методов и функций для любых задач обработки данных
  • Высокая производительность: оптимизированные алгоритмы для работы с большими объемами данных
  • Гибкость: поддержка множества форматов данных и способов их обработки
  • Интеграция: отличная совместимость с другими библиотеками Python
  • Активное сообщество: постоянное развитие и поддержка

Для специалистов по данным, аналитиков, исследователей и разработчиков Pandas является фундаментальным инструментом, который значительно упрощает и ускоряет работу с данными. Изучение этой библиотеки — это инвестиция в профессиональное развитие, которая окупается экономией времени и возможностью решать более сложные задачи с меньшими усилиями.

Новости