Аналитика, машинное обучение и наука о данных для начинающих / Analytics, machine learning, and data science for beginners. Просто о сложных технологиях
📚 Pandas для начинающих: Series и DataFrame
🎯 В чём суть?
Pandas — это надстройка над NumPy. Зачем? NumPy отлично работает с многомерными массивами, но имеет ограничения:
- Массивы «безликие»: нет подписей у строк и столбцов
- Плохо работает с разнотипными данными (числа + текст + даты)
- Для анализа (группировки, сводных) нужно много кода
В аналитике данные имеют структуру (названия столбцов, метки строк) и, как правило, неоднородную: пропуски, разные типы данных и т.д.
🚀 Pandas добавляет главное — именованную структуру данных:
- У столбцов есть имена (например, «город»)
- У строк есть индексы (метки, например, id пользователя), не обязательно уникальные
- Все операции (объединение, группировка, фильтрация) работают по именам, а не по позициям
Коротко: NumPy — про быстрые вычисления с числами. Pandas — про работу с поименованными данными.
🔄 ETL-конвейер на Pandas — основной сценарий работы аналитика
В своей работе аналитик постоянно делает микро-ETL:
1. Извлечь (Extract) — загрузить данные (CSV, Excel, SQL, API)
2. Преобразовать (Transform) — обработать: очистить, отфильтровать, сгруппировать, посчитать метрики
3. Загрузить (Load) — сохранить результат (в новый файл, базу данных, отчёт)
Pandas закрывает все три этапа в одном инструменте — быстрый «ручной» ETL. Большие промышленные ETL-пайплайны инженеры данных пишут на оркестраторах вроде Airflow, но внутри них всё равно часто вызывают Pandas-скрипты.
🧱 Две главные структуры Pandas
• Series — одномерный массив с метками (столбец)
• DataFrame — двумерная таблица с именами строк и столбцов (таблица)
📈 Series
`pd.Series` — одномерный индексируемый массив. Индексы могут быть неуникальными (например, 'a', 'b', 'b'). Series можно создать из любого итерируемого объекта.
import pandas as pd
import numpy as np
Из списка (индексы по умолчанию):
pd.Series([10, 20, 30, 40])
# 0 10
# 1 20
# 2 30
# 3 40
Из кортежа:
pd.Series((1, 2, 3))
Из генератора:
pd.Series(range(3))
Из строки (итерируется по символам):
pd.Series('abc')
# 0 a
# 1 b
# 2 c
Из множества:
pd.Series({1, 2, 3})
Из словаря (ключи → индексы, значения → данные):
pd.Series({'яблоко': 5, 'банан': 7, 'апельсин': 3})
Из NumPy-массива:
arr = np.array([100, 200, 300])
pd.Series(arr, index=['x', 'y', 'z'])
📊 DataFrame
`pd.DataFrame` — двумерная таблица: и строки, и столбцы имеют имена. Создаётся из любого итерируемого объекта, но требующего двумерную структуру (список списков, словарь списков и т.д.).
Из списка списков (явно задаём названия столбцов):
pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
# A B
# 0 1 2
# 1 3 4
Из словаря списков (ключи → названия столбцов):
data = {'имя': ['Аня', 'Боря'], 'возраст': [25, 30]}
df = pd.DataFrame(data)
print(df)
# имя возраст
# 0 Аня 25
# 1 Боря 30
print(df['имя']) # доступ по имени столбца
print(df.index) # RangeIndex(start=0, stop=2)
Из списка словарей (каждый словарь — строка):
rows = [{'город': 'Москва', 'год': 2020},
{'город': 'Казань', 'год': 2021}]
pd.DataFrame(rows)
# город год
# 0 Москва 2020
# 1 Казань 2021
Из NumPy-массива:
arr = np.array([[1, 2], [3, 4], [5, 6]])
pd.DataFrame(arr, columns=['A', 'B'], index=['x', 'y', 'z'])
# A B
# x 1 2
# y 3 4
# z 5 6
📐 Оси в Pandas
Оси в Pandas работают так же, как в NumPy:
- `axis=0` — операции вдоль строк (индексы)
- `axis=1` — операции вдоль столбцов (названия)
Тут: про Оси (axis) в NumPy. Важно для понимания, как Pandas соединит данные.
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df.mean(axis=0) # ср. по строкам (для каждого столбца)
# A 1.5
# B 3.5
df.mean(axis=1) # ср. по столбцам (для каждой строки)
# 0 2.0
# 1 3.0
⚠️ Правило фиксированной длины
У Series / DataFrame нельзя просто добавить строку (как в списке Python). Внутри Pandas использует массивы NumPy фиксированного размера — это даёт высокую скорость, но требует создания нового объекта при изменении.
💬 Далее:
Pandas: индексы и доступ к данным Если у вас установлено приложение,
вы можете сразу перейти в канал