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:
- Используйте векторизованные операции вместо циклов
- Применяйте метод
query()для сложных фильтров - Используйте
categoricalтип для строковых данных с повторяющимися значениями - Читайте данные частями при работе с большими файлами
- Используйте
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 является фундаментальным инструментом, который значительно упрощает и ускоряет работу с данными. Изучение этой библиотеки — это инвестиция в профессиональное развитие, которая окупается экономией времени и возможностью решать более сложные задачи с меньшими усилиями.
Настоящее и будущее развития ИИ: классической математики уже недостаточно
Эксперты предупредили о рисках фейковой благотворительности с помощью ИИ
В России разработали универсального ИИ-агента для роботов и индустриальных процессов