</>
Тема 1 из 7

Series — столбец с подписями

pandas — главная библиотека для работы с табличными данными в Python: продажи, оценки, логи, результаты опросов. Если numpy — это «быстрые массивы чисел», то pandas — это «таблицы с подписями»: у строк и столбцов есть имена, а в столбцах могут быть числа, строки и даты.

import pandas as pd

В pandas два главных типа данных: Series — один столбец и DataFrame — таблица из нескольких столбцов. Начнём с Series.

Series: значения и подписи

temps = pd.Series([12, 15, 9], index=["пн", "вт", "ср"])
print(temps)
пн    12
вт    15
ср     9
dtype: int64

Слева — индекс (подписи), справа — значения. Если индекс не задать, он будет 0, 1, 2, …. Series можно создать и из словаря: ключи станут подписями.

stock = pd.Series({"яблоки": 40, "груши": 25})

Доступ к значениям

print(temps["вт"])        # 15 — по подписи
print(temps.iloc[0])      # 12 — по позиции
print(temps.index)        # подписи
print(temps.values)       # значения как массив numpy

У Series два способа обращения: по подписи (s["вт"] или s.loc["вт"]) и по позиции (s.iloc[0]). Когда подписи — числа, s[0] может означать подпись 0, а не первую позицию, поэтому для позиций всегда используй iloc.

Операции

Всё, что умеет массив numpy, умеет и Series: арифметика поэлементно, маски, агрегаты.

print(temps + 1)               # каждое значение +1
print(temps[temps > 10])       # маска — только тёплые дни
print(temps.mean(), temps.max())
print(temps.idxmax())          # 'вт' — подпись максимума

idxmax и idxmin возвращают подпись, а не позицию. При нескольких одинаковых максимумах — первую.

Выравнивание по подписям

Главная особенность pandas: при операциях двух Series значения сопоставляются по подписям, а не по позициям:

march = pd.Series({"Аня": 5, "Боря": 3})
april = pd.Series({"Боря": 4, "Вика": 6})
print(march + april)
Аня     NaN
Боря    7.0
Вика    NaN
dtype: float64

Где подпись есть только в одном Series, получается NaN — «нет значения» (из-за этого числа стали дробными). Пропуски можно убрать (dropna()) или заменить (fillna(0)). Подробнее о пропусках — в последней теме.

Подсчёт значений

value_counts — одна из самых полезных функций: сколько раз встречается каждое значение, по убыванию частоты.

colors = pd.Series(["red", "blue", "red", "green", "red", "blue"])
counts = colors.value_counts()
print(counts)
red      3
blue     2
green    1
Name: count, dtype: int64

Результат — тоже Series: подписи — значения, значения — частоты. С normalize=True получатся доли вместо количеств.

Быстрая сводка

describe() выдаёт главные статистики числового Series: количество, среднее, стандартное отклонение, минимум, квартили и максимум. Полезно для первого знакомства с данными.

Сортировка

print(temps.sort_values())                  # по значениям
print(temps.sort_values(ascending=False))   # по убыванию
print(temps.sort_index())                   # по подписям

Перебор

for day, t in temps.items():
    print(day, t)

Итог

  • pd.Series(значения, index=подписи) — столбец с подписями;
  • s["подпись"]/s.loc[...] — по подписи, s.iloc[i] — по позиции;
  • операции поэлементные, а между двумя Series — по совпадающим подписям; несовпавшие дают NaN;
  • value_counts, describe, idxmax, sort_values, sort_index, items.