Что такое Pandas и как установить через pip: первые Series и DataFrame
Первая таблица DataFrame в библиотеке pandas, умный столбец Series и быстрый осмотр данных через head, info и describe — старт сквозного анализа данных интернет-магазина.
Редакция Питоники
У вас в руках выгрузка заказов на 300 000 строк. Excel открывает файл сорок секунд, сводная таблица падает на середине, а фильтр по городу намертво вешает ноутбук. Знакомо? Именно в этот момент стоит открыть редактор кода — потому что библиотека pandas съедает такие таблицы на завтрак, а операции, которые в Excel делаются мышкой и страданиями, записываются одной строкой.
Этот урок — первый в серии из десяти, и мы не будем гнать вас по справочнику. Всё обучение построено вокруг одного сквозного сюжета: анализ данных интернет-магазина электроники. Товары, заказы, города, клиенты — на этих данных вы пройдёте весь путь: от первого DataFrame до готового отчёта о продажах. Начнём с главного вопроса: что вообще такое pandas и почему вокруг него столько шума.
Что такое pandas и зачем он аналитику
Pandas — это библиотека Python для работы с табличными данными. Её название происходит от panel data — так экономисты называют данные по панелям наблюдений. Библиотека построена поверх NumPy: если NumPy умеет быстро считать однородные массивы чисел (мы разбирали это в введении в NumPy), то pandas добавляет то, чего массивам не хватает, — подписи строк и столбцов, разные типы данных в одной таблице и тысячи готовых операций над таблицами.
Зачем это на практике? Вот типичный день аналитика, который pandas закрывает без единого движения мышкой:
- прочитать выгрузку из CRM в CSV или Excel и мгновенно увидеть её структуру;
- отфильтровать заказы по городу, цене и дате — хоть тремя условиями сразу;
- посчитать выручку по месяцам и городам одним вызовом groupby;
- найти и почистить пропуски, дубликаты и кривые типы данных;
- склеить таблицу заказов с таблицей клиентов, как это делает SQL JOIN.
То есть всё то же самое, что вы умеете в Excel, только с миллионами строк, воспроизводимо и без риска сломать формулу случайным нажатием клавиши. Давайте посмотрим на противостояние честно.
Pandas и Excel: кто кого
| Критерий | Excel | Pandas |
|---|---|---|
| Объём данных | около миллиона строк, дальше боль | миллионы строк, если хватает памяти |
| Повторяемость | руками, шаг за шагом | код: перезапустил — и анализ повторился |
| Скорость операций | секунды и минуты | миллисекунды за счёт векторных операций |
| Автоматизация | макросы VBA | обычный скрипт Python |
| Отчёт для директора | да, это его стихия | нет, для этого берите графики |
Честности ради: для таблички на двадцать строк pandas не нужен. Excel останется с нами для разовых мелочей. Но как только данных становится много, операций — много, а повторять их приходится каждую неделю, выигрывает pandas. И главное: анализ, записанный кодом, можно перечитать, поправить и запустить заново. Попробуйте повторить по памяти двадцать шагов мышкой в Excel-файле, который вам прислали полгода назад.
Установка и импорт
Если работаете на своём компьютере, библиотека ставится одной командой: pip install pandas. В редакторе этого самоучителя ничего ставить не нужно — pandas уже загружен в браузерный интерпретатор, и любой пример ниже можно запустить кнопкой. Вы пишете код прямо на странице и сразу видите результат.
Как импортировать pandas в Python?
import pandas as pd
# pd — общепринятое сокращение, так пишут в 99% проектов
orders = pd.DataFrame({"city": ["Москва", "Казань"], "qty": [3, 1]})
print(orders)
city qty 0 Москва 3 1 Казань 1
Строка import pandas as pd будет начинать почти каждый ваш скрипт. Сокращение pd — не прихоть автора: оно закреплено официальной документацией и встречается в каждом туториале, так что лучше привыкать к нему с первой минуты.
Series — умный столбец таблицы
Во главе pandas стоят две структуры данных. Первая — Series: одномерный набор значений с индексом. По сути это столбец таблицы. Создадим его из обычного списка Python:
import pandas as pd
# Цены на товары магазина
prices = pd.Series([54990, 24990, 31990, 12990])
print(prices)
0 54990 1 24990 2 31990 3 12990 dtype: int64
Слева — индекс (pandas проставил номера 0, 1, 2, 3 автоматически), справа — значения, внизу — тип данных dtype: int64 означает целые числа. Индекс — то, что отличает Series от обычного списка: к значениям можно обращаться по позиции и по осмысленной метке.
import pandas as pd
prices = pd.Series([54990, 24990, 31990],
index=["Ноутбук", "Смартфон", "Планшет"])
print(prices["Смартфон"]) # обращаемся по метке, а не по номеру
24990
Метка «Смартфон» работает как ключ в словаре, только с суперспособностями Series: те же цены можно просуммировать, умножить на размер скидки или сравнить с бюджетом одной операцией — без единого цикла. К циклам for вы в pandas будете возвращаться всё реже, и это хорошо.
DataFrame: что это и как создать из словаря
Вторая ключевая структура — DataFrame, двумерная таблица: у строк есть индекс, у столбцов — имена, а в разных столбцах могут лежать данные разных типов. Слово «датафрейм» вы теперь будете слышать каждый день. Самый наглядный способ создать его руками — собрать из словаря, где ключ это имя столбца, а список — его данные:
import pandas as pd
data = {
"product": ["Ноутбук", "Смартфон", "Планшет"],
"price": [54990, 24990, 31990],
"qty": [2, 5, 3],
}
df = pd.DataFrame(data)
print(df)
product price qty 0 Ноутбук 54990 2 1 Смартфон 24990 5 2 Планшет 31990 3
Три столбца, три строки, нумерация слева — pandas уже нарисовал нам таблицу. Единственное жёсткое правило: списки внутри словаря должны быть одинаковой длины, иначе pandas не сможет выровнять данные по строкам и выдаст ошибку. Переменную с таблицей принято называть df — от DataFrame; в чужом коде и в документации вы будете встречать это имя постоянно.
head, tail и быстрый осмотр данных
Соберём таблицу заказов нашего магазина — шесть строк, чтобы всё было видно сразу. Первый рефлекс после создания или загрузки любой таблицы: посмотреть на неё глазами. Печатать целиком неудобно, когда строк тысячи, поэтому используют метод head:
import pandas as pd
data = {
"order_id": [1001, 1002, 1003, 1004, 1005, 1006],
"city": ["Москва", "Казань", "Москва", "Сочи", "Казань", "Москва"],
"product": ["Ноутбук", "Смартфон", "Планшет", "Наушники", "Ноутбук", "Смартфон"],
"price": [54990, 24990, 31990, 8990, 57990, 25990],
"qty": [1, 2, 1, 3, 1, 1],
}
df = pd.DataFrame(data)
print(df.head(3)) # первые три строки
order_id city product price qty 0 1001 Москва Ноутбук 54990 1 1 1002 Казань Смартфон 24990 2 2 1003 Москва Планшет 31990 1
Без аргумента head() покажет пять строк — это значение по умолчанию. Симметричный метод tail() возвращает строки с конца таблицы: df.tail(2) выдаст заказы 1005 и 1006. А df.sample(3) перемешает и покажет три случайные строки — удобно просматривать данные без систематического перекоса к началу файла.
info(): техпаспорт таблицы
Когда данных много, взглядом всё не проверить. Метод info() даёт сводку: сколько строк и столбцов, где есть пропуски, какие у столбцов типы. Обратите внимание: info() печатает отчёт сам, поэтому его вызывают без print():
import pandas as pd
data = {
"order_id": [1001, 1002, 1003, 1004, 1005, 1006],
"city": ["Москва", "Казань", "Москва", "Сочи", "Казань", "Москва"],
"product": ["Ноутбук", "Смартфон", "Планшет", "Наушники", "Ноутбук", "Смартфон"],
"price": [54990, 24990, 31990, 8990, 57990, 25990],
"qty": [1, 2, 1, 3, 1, 1],
}
df = pd.DataFrame(data)
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 6 entries, 0 to 5 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 order_id 6 non-null int64 1 city 6 non-null object 2 product 6 non-null object 3 price 6 non-null int64 4 qty 6 non-null int64 dtypes: int64(3), object(2) memory usage: 372.0+ bytes
Как читать этот отчёт построчно:
- RangeIndex: 6 entries — таблица содержит шесть строк со стандартной нумерацией от 0 до 5;
- Non-Null Count — сколько непустых значений в столбце; если тут не 6 non-null, а, скажем, 5, значит в столбце есть пропуск;
- Dtype — тип столбца: int64 это целые числа, object — текст;
- memory usage — сколько таблица занимает в памяти; на больших данных это подсказка, почему скрипт съел всю оперативку.
Привычка вызывать info() сразу после загрузки данных не раз спасала меня: половина ошибок в анализе начинается с того, что числовой столбец тихо приехал из файла как текст.
describe(): статистика одной строкой
Следующий шаг осмотра — числовая сводка. Метод describe() считает по каждому числовому столбцу сразу восемь базовых статистик:
import pandas as pd
data = {
"order_id": [1001, 1002, 1003, 1004, 1005, 1006],
"city": ["Москва", "Казань", "Москва", "Сочи", "Казань", "Москва"],
"product": ["Ноутбук", "Смартфон", "Планшет", "Наушники", "Ноутбук", "Смартфон"],
"price": [54990, 24990, 31990, 8990, 57990, 25990],
"qty": [1, 2, 1, 3, 1, 1],
}
df = pd.DataFrame(data)
print(df.describe())
order_id price qty count 6.000000 6.000000 6.00000 mean 1003.500000 34156.666667 1.50000 std 1.870829 18925.291719 0.83666 min 1001.000000 8990.000000 1.00000 25% 1002.250000 25240.000000 1.00000 50% 1003.500000 28990.000000 1.00000 75% 1004.750000 49240.000000 1.75000 max 1006.000000 57990.000000 3.00000
Расшифровка: count — количество значений, mean — среднее, std — стандартное отклонение, min и max — минимум и максимум, а 25%, 50% и 75% — квартили, то есть значения, ниже которых лежит четверть, половина и три четверти данных. Медиана здесь — строка 50%. Уже из одной таблички видно: средняя цена заказа 34 157 рублей, но медиана всего 28 990 — значит, редкие дорогие заказы тянут среднее вверх.
shape, columns, dtypes: атрибуты таблицы
Три атрибута вы будете использовать каждый день. Важно: это атрибуты, а не методы, — у них нет скобок. Если написать df.shape(), получите ошибку TypeError, потому что shape — уже готовое значение, а не функция.
import pandas as pd
data = {
"order_id": [1001, 1002, 1003, 1004, 1005, 1006],
"city": ["Москва", "Казань", "Москва", "Сочи", "Казань", "Москва"],
"product": ["Ноутбук", "Смартфон", "Планшет", "Наушники", "Ноутбук", "Смартфон"],
"price": [54990, 24990, 31990, 8990, 57990, 25990],
"qty": [1, 2, 1, 3, 1, 1],
}
df = pd.DataFrame(data)
print(df.shape) # размер: строки, столбцы
print(list(df.columns)) # имена столбцов
print(df.dtypes) # тип каждого столбца
(6, 5) ['order_id', 'city', 'product', 'price', 'qty'] order_id int64 city object product object price int64 qty int64 dtype: object
shape возвращает кортеж (строки, столбцы): у нас шесть заказов и пять полей. Запомните порядок — сначала строки. На собеседованиях любят спрашивать, что вернёт df.shape[0] (ответ: число строк).
Одна колонка — это Series, и почему это важно
Достанем один столбец и посчитаем по нему среднее. Для Series доступны все методы статистики без циклов:
import pandas as pd
data = {
"order_id": [1001, 1002, 1003, 1004, 1005, 1006],
"city": ["Москва", "Казань", "Москва", "Сочи", "Казань", "Москва"],
"product": ["Ноутбук", "Смартфон", "Планшет", "Наушники", "Ноутбук", "Смартфон"],
"price": [54990, 24990, 31990, 8990, 57990, 25990],
"qty": [1, 2, 1, 3, 1, 1],
}
df = pd.DataFrame(data)
col = df["price"]
print(type(col)) # это Series
print(col.mean()) # средняя цена заказа
<class 'pandas.core.series.Series'> 34156.666666666664
Странноватый хвост 34156.666666666664 вместо круглого числа — не баг, а честная арифметика чисел с плавающей точкой; к этому просто привыкают. А теперь тонкость, на которой спотыкаются даже опытные: двойные квадратные скобки дают другой результат.
print(df[["price"]]) # снова DataFrame, а не Series
print(type(df[["price"]]))
price 0 54990 1 24990 2 31990 3 8990 4 57990 5 25990 <class 'pandas.core.frame.DataFrame'>
Двойные скобки означают «верни набор столбцов», даже если столбец один, — и pandas отдаёт маленький DataFrame с одной колонкой. У Series и одноимённого DataFrame разные методы и разное поведение в операциях, поэтому, когда что-то ведёт себя не так, как ожидали, первым делом печатайте type() результата. Эта же разница всплывёт в уроке про выборку строк loc и iloc: там она решает, получите вы скаляр или таблицу.
Ошибки, на которых спотыкаются все
Ещё одна классика: новички путают count из describe() (число непустых значений столбца) и len(df) (число строк). Пока в таблице нет пропусков, они совпадают; как только появляются NaN — расходятся, и разница как раз равна числу пропусков. Пропусками мы займёмся в уроке про очистку данных, а пока просто держите это в голове.
Что дальше: учимся читать настоящие файлы
Мы собрали таблицу руками, но в реальной работе данные приходят файлами: CSV из CRM, Excel от бухгалтерии, JSON от разработчиков. Во втором уроке разберём read_csv со всеми параметрами, которые нужны каждый день: разделители, кодировки с кириллицей, чтение куска большого файла. Вы загрузите заказы магазина так, будто они пришли по почте, — и сразу примените head, info и describe из этого урока. Полный план движения по разделу — самоучитель Pandas с нуля: после чтения файлов вас ждут фильтры, очистка, группировки и merge.
А пока закрепите материал тестом ниже и практической задачей: соберите каталог товаров магазина из словаря и осмотрите его изученными методами. Это займёт пять минут, а привычка «создал — сразу осмотрел» останется с вами на всю карьеру.
Сначала предскажи ответ в голове — это главный навык программиста.
import pandas as pd
s = pd.Series([10, 20, 30, 40])
print(s[2])
import pandas as pd
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
print(df.shape)
1. Что вернёт df["price"], если price — обычный столбец таблицы?
2. Сколько строк покажет df.head(2) для таблицы из 6 строк?
3. Как узнать размер таблицы (число строк и столбцов) одним вызовом?
4. Каких строк НЕ будет в выводе df.describe() для числового столбца?
5. Как создать DataFrame из словаря списков data?
Соберите каталог товаров магазина из словаря: столбцы product, price, qty с четырьмя товарами (Ноутбук 54990 и 2 штуки, Смартфон 24990 и 5, Наушники 8990 и 3, Планшет 31990 и 1). Создайте DataFrame, выведите его на экран и его размер.
Что такое Pandas и для чего он используется?
Pandas — библиотека Python для анализа табличных данных. Она читает CSV и Excel, фильтрует и группирует строки, считает сводные и чистит пропуски. Типичные задачи: отчёты о продажах, обработка выгрузок из CRM, подготовка данных для машинного обучения.
Чем DataFrame отличается от Series?
Series — одномерная структура: один столбец значений с индексом. DataFrame — двумерная таблица из нескольких столбцов с общим индексом. df["price"] возвращает Series, а df[["price"]] — маленький DataFrame.
Что показывает describe() в pandas?
Для числовых столбцов — восемь статистик: количество значений, среднее, стандартное отклонение, минимум, квартили 25%, 50% и 75%, максимум. Для текстовых столбцов при вызове describe(include="all") — число уникальных значений и самое частое.
Как создать DataFrame в pandas с нуля?
Чаще всего — из словаря списков: pd.DataFrame({"city": ["Москва"], "qty": [3]}), где ключ — имя столбца. Также DataFrame собирают из списка словарей, из NumPy-массива или читают из файла через read_csv — об этом следующий урок.
Что делают head() и tail() в pandas?
head() выводит первые строки таблицы, tail() — последние; без аргумента обе показывают пять строк, df.head(3) — три. Это самый быстрый способ осмотреть данные после загрузки. Случайные строки даст df.sample(3), а размер таблицы — df.shape.
Когда pandas лучше Excel?
Для разовой таблички на двадцать строк pandas не нужен — Excel остаётся для мелочей. Pandas выигрывает, когда данных много (миллионы строк), операции повторяются каждую неделю и анализ должен воспроизводиться кодом: перезапустил — и отчёт собрался заново. А вот отчёт для директора с картинками — по-прежнему стихия Excel.
Понравился урок? Сошлитесь на него
«И главное: анализ, записанный кодом, можно перечитать, поправить и запустить заново.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что читать дальше
Pandas · Урок 2
Чтение файлов в Pandas: read_csv, read_excel и знакомство с данными
read_csv со всеми нужными параметрами и примерами: разделители, кодировки с кириллицей, чтение куска большого файла и первые ошибки, которые вы увидите на практике.
NumPy · Урок 1
Что такое NumPy и как установить через pip: первый массив ndarray
Первый массив ndarray: создаём, сравниваем со списком, разбираем dtype и shape — и ускоряем сумму миллиона чисел примерно в сто раз.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
FastAPI · Урок 1
Что такое API и REST: введение в FastAPI для начинающих
Понять, что такое API, REST, HTTP-методы и JSON — и подготовиться к первому приложению на FastAPI.
что такое apirest api для начинающих
sqlite3 · Урок 1
SQL с нуля через Python: первая база SQLite и таблица
Первая настоящая база данных без установки серверов: import sqlite3, курсор, CREATE TABLE и первые строки — всё исполняется прямо на странице.
sql с нуляsql для начинающих
Pandas · Урок 6
Сортировка, топы и подсчёты: sort_values, value_counts, rank
sort_values по нескольким столбцам, nlargest вместо сортировки всей таблицы, частоты value_counts и рейтинги rank — собираем отчёты «топ-10 товаров» и «доли городов».
pandas sort_valuesсортировка dataframe