Перейти к содержанию

172 уроков, 13 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 1 из 10 Начальный 35 мин 100 XP

Что такое 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: кто кого

КритерийExcelPandas
Объём данныхоколо миллиона строк, дальше больмиллионы строк, если хватает памяти
Повторяемостьруками, шаг за шагомкод: перезапустил — и анализ повторился
Скорость операцийсекунды и минутымиллисекунды за счёт векторных операций
Автоматизациямакросы 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:

Series из списка
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, двумерная таблица: у строк есть индекс, у столбцов — имена, а в разных столбцах могут лежать данные разных типов. Слово «датафрейм» вы теперь будете слышать каждый день. Самый наглядный способ создать его руками — собрать из словаря, где ключ это имя столбца, а список — его данные:

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():

info() — сводка по таблице
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() считает по каждому числовому столбцу сразу восемь базовых статистик:

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 доступны все методы статистики без циклов:

Столбец как 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)
Проверь себя
0 / 5

1. Что вернёт df["price"], если price — обычный столбец таблицы?

2. Сколько строк покажет df.head(2) для таблицы из 6 строк?

3. Как узнать размер таблицы (число строк и столбцов) одним вызовом?

4. Каких строк НЕ будет в выводе df.describe() для числового столбца?

5. Как создать DataFrame из словаря списков data?

Карточки терминов
Запомнено: 0 / 6
Практика

Соберите каталог товаров магазина из словаря: столбцы product, price, qty с четырьмя товарами (Ноутбук 54990 и 2 штуки, Смартфон 24990 и 5, Наушники 8990 и 3, Планшет 31990 и 1). Создайте DataFrame, выведите его на экран и его размер.

practice.py
Вопросы и ответы по уроку

Что такое 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-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.