Табличные данные — Pandas, Polars, SQL и PySpark
Назначение
Краткая напоминалка для работы с табличными данными: одна и та же задача формулируется по-разному в четырёх часто встречающихся инструментах.
| Инструмент | Где выполняется | Типичный масштаб |
|---|---|---|
| Pandas | Python, одна машина, RAM | Прототипы, EDA, файлы до объёма ОЗУ |
| Polars | Python (Rust-ядро), одна машина | Те же задачи, что у Pandas, но быстрее на больших таблицах в памяти |
| SQL | СУБД (PostgreSQL, MySQL и др.) | Данные уже в таблицах; фильтр и агрегация на стороне сервера |
| PySpark | Кластер Apache Spark | Данные не помещаются на одном узле или нужен распределённый конвейер |
Учебный контекст — Python для анализа, Data Science и Big Data. Для чистого SQL без Python — шпаргалка по SQL.
В колонках — эквивалентные операции. Имена столбцов (column, col1, agg_col) и имя таблицы (table, table1) — плейсхолдеры. В PySpark для groupBy и агрегатов нужен импорт функций, например from pyspark.sql.functions import avg.
Сводная таблица операций
| Операция | Pandas | Polars | SQL | PySpark |
|---|---|---|---|---|
| Импорт библиотеки / сессия | import pandas as pd | import polars as pl | — | from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("app").getOrCreate() |
| Чтение CSV | df = pd.read_csv("data.csv") | df = pl.read_csv("data.csv") | PostgreSQL: COPY table FROM 'data.csv' WITH (FORMAT csv, HEADER true);MySQL: LOAD DATA INFILE 'data.csv' INTO TABLE table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS; | df = spark.read.csv("data.csv", header=True, inferSchema=True) |
| Первые k строк | df.head(10) | df.head(10) | SELECT * FROM table LIMIT 10; | df.show(10) |
| Размер (строки × столбцы) | df.shape | df.shape | Строки: SELECT count(*) FROM table;Столбцы: SELECT count(*) FROM information_schema.columns WHERE table_name = 'table'; | Строки: df.count()Столбцы: len(df.columns) |
| Типы столбцов | df.dtypes | df.schema или df.dtypes | DESCRIBE table; (MySQL)SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'table'; (PostgreSQL) | df.printSchema() |
| Выбор столбцов | df[["col1", "col2"]] | df.select("col1", "col2") | SELECT col1, col2 FROM table; | df.select("col1", "col2") |
| Фильтр строк | df[df["column"] > 10] | df.filter(pl.col("column") > 10) | SELECT * FROM table WHERE column > 10; | df.filter(df["column"] > 10) |
| Сортировка | df.sort_values("column") | df.sort("column") | SELECT * FROM table ORDER BY column; | df.orderBy("column") |
| Заполнить пропуски | df["column"].fillna(0) | df.with_columns(pl.col("column").fill_null(0)) | UPDATE table SET column = 0 WHERE column IS NULL; | df.fillna(0) или df.na.fill(0) |
| Соединение таблиц | pd.merge(df1, df2, on="col", how="inner") | df1.join(df2, on="col", how="inner") | SELECT * FROM table1 INNER JOIN table2 ON table1.col = table2.col; | df1.join(df2, on="col", how="inner") |
| Объединить строки (stack) | pd.concat([df1, df2]) | pl.concat([df1, df2]) | SELECT * FROM table1 UNION ALL SELECT * FROM table2; | df1.union(df2) |
| Группировка и среднее | df.groupby("column")["agg_col"].mean() | df.group_by("column").agg(pl.mean("agg_col")) | SELECT column, avg(agg_col) FROM table GROUP BY column; | df.groupBy("column").agg(avg("agg_col")) |
| Уникальные значения | df["column"].unique() | df["column"].unique() | SELECT DISTINCT column FROM table; | df.select("column").distinct() |
| Переименовать столбец | df.rename(columns={"old_name": "new_name"}) | df.rename({"old_name": "new_name"}) | PostgreSQL: ALTER TABLE table RENAME COLUMN old_name TO new_name; | df.withColumnRenamed("old_name", "new_name") |
| Удалить столбец | df.drop(columns=["column"]) | df.drop("column") | ALTER TABLE table DROP COLUMN column; | df.drop("col1", "col2") |
Когда какой инструмент
Pandas — де-факто стандарт для учебных ноутбуков и быстрого EDA: богатая экосистема, много примеров в сети. Ограничение — данные должны помещаться в память одного процесса.
Polars — тот же класс задач (таблица в RAM), но вычисления на Rust и ленивые планы в LazyFrame часто дают кратный выигрыш по скорости. Синтаксис ближе к Spark/SQL, чем к классическому Pandas.
SQL — когда данные уже лежат в СУБД и переносить миллионы строк в Python невыгодно. Агрегации, join и фильтры выполняет оптимизатор базы; Python подключается через read_sql / драйвер или ORM.
PySpark — когда одной машины мало: кластер, HDFS/S3, потоковая обработка, единый движок с Spark SQL. API DataFrame сознательно похож на Pandas, но вычисления ленивые до вызова действия (.count(), .show(), .write).
Частые отличия (не в таблице)
- Соединение таблиц: в Pandas
pd.merge(..., how="inner"|"left"|"right"|"outer"), в Polars и PySparkjoin(..., how=…)— те же четыре режима, чтоINNER,LEFT,RIGHTиFULL OUTERв SQL. Разбор на двух таблицах с ключами 1–4 — четыре основных JOIN. - Пропуски: в Pandas —
NaN(fillna); в Polars —null(fill_null) и отдельноNaNдля float (fill_nan). В SQL —IS NULL. - Индекс: у Pandas есть именованный индекс строк; у Polars и Spark DataFrame — только столбцы (плюс служебные метаданные).
- Копия и view: в Pandas срезы иногда дают view на те же данные; в Polars и Spark неизменяемость и план выполнения устроены иначе — ориентируйтесь на явные
.copy()/ новые DataFrame. - Union в Spark: схемы
df1иdf2должны совпадать по именам и совместимым типам.
См. также
- Pandas — типовые операции при анализе данных — импорт и экспорт, выбор, статистика, строки, временные ряды (только pandas)
- Очистка и подготовка данных в Pandas — пропуски, дубликаты, типы столбцов, фильтры и
groupbyтолько в pandas - Анализ данных — pandas, NumPy, SciPy — углублённо про Pandas и связку с NumPy
- Объединение таблиц и своды в Pandas — merge, pivot, временные ряды
- Оператор SELECT · JOIN · группировка
- Глоссарий: Pandas
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Интерпретация данных представляет собой процесс перевода количественных результатов анализа в качественное понимание явлений и процессов. Big Data — это относительное состояние, при котором объём данных превышает возможности традиционных систем хранения и обработки с точки зрения производительности, стоимости или масштабируемости. Data Science - междисциплинарный подход к извлечению знаний из данных через статистику, моделирование и предметную экспертизу. Дата-майнинг и KDD - связь с полным циклом от постановки задачи до интерпретации найденных закономерностей в данных. Критическое мышление в анализе. Фиксация на цифрах и ложь в статистике. Интегрированная система управления инженерными и бытовыми компонентами жилого пространства, построенная на принципах автоматизации. Поддержка физической активности, повышение эффективности тренировок, контроль состояния организма. Базовые показатели. Как работать с представлениями данных. ИИ в анализе данных - автоматизация поиска закономерностей и поддержка решений с помощью машинного обучения и нейросетевых моделей. Причинно-следственные связи в анализе - как действия и условия порождают измеримые результаты и выводы. Потоковая аналитика в реальном времени - обработка событий по мере поступления и извлечение сигналов без обязательного долгого хранения сырых данных. Описательная статистика служит для краткого обобщения свойств набора данных. Она позволяет понять центральную тенденцию, разброс и форму распределения.Анализ данных
Big Data
Data Science
Дата майнинг
Ошибки интерпретации и манипуляции статистикой
Умный дом
Технологии в спорте
Основы статистики
Как использовать ИИ для анализа данных
Причинно-следственный анализ
Потоковая аналитика в реальном времени
Python для анализа данных