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.