Перейти к основному содержимому

Табличные данные — Pandas, Polars, SQL и PySpark

Аналитику Разработчику

Назначение

Краткая напоминалка для работы с табличными данными — одна и та же задача формулируется в Excel, Pandas, Polars, SQL и PySpark. Колонка Excel полезна при переходе с электронных таблиц — см. EDA в Excel, формулы с разбором и маршрут Excel → R → Python.

ИнструментГде выполняетсяТипичный масштаб
Excelлокальный файл .xlsx / .csvEDA, отчёты до ~1 млн строк на ПК
PandasPython, одна машина, RAMПрототипы, EDA, файлы до объёма ОЗУ
PolarsPython (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.

Сводная таблица операций

ОперацияExcelPandasPolarsSQLPySpark
Импорт / сессияоткрыть файл; таблица Ctrl+Timport pandas as pdimport polars as plfrom pyspark.sql import SparkSession
spark = SparkSession.builder.appName("app").getOrCreate()
Чтение CSV"Данные" → из текста/CSVdf = 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 ...
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.shapedf.shapeSELECT count(*) ...df.count(), len(df.columns)
Типы столбцовформат ячеек; "Тип данных"df.dtypesdf.schemaDESCRIBE / information_schemadf.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)WHERE column > 10df.filter(df["column"] > 10)
Сортировка"Данные" → сортировкаdf.sort_values("column")df.sort("column")ORDER BY columndf.orderBy("column")
Заполнить пропуски"Найти и выделить" → заменить; ЕСЛИdf["column"].fillna(0)fill_null(0)UPDATE ... WHERE column IS NULLdf.fillna(0)
Соединение таблицВПР / XLOOKUP; Power Querypd.merge(df1, df2, on="col", how="inner")df1.join(df2, on="col", how="inner")INNER JOIN ... ONdf1.join(df2, on="col", how="inner")
Объединить строки (stack)листы книги; СЦЕПИТЬ по строкамpd.concat([df1, df2])pl.concat([df1, df2])UNION ALLdf1.union(df2)
Группировка и среднеесводная таблицаdf.groupby("column")["agg_col"].mean()group_by(...).agg(pl.mean("agg_col"))GROUP BY + avg(agg_col)groupBy("column").agg(avg("agg_col"))
Уникальные значения"Удалить дубликаты"; УНИКdf["column"].unique()df["column"].unique()SELECT DISTINCT columndf.select("column").distinct()
Переименовать столбецправка заголовкаdf.rename(columns={...})df.rename({...})ALTER TABLE ... RENAME COLUMNwithColumnRenamed(...)
Удалить столбецудалить столбецdf.drop(columns=["column"])df.drop("column")ALTER TABLE ... DROP COLUMNdf.drop("col1", "col2")

Когда какой инструмент

Excel — быстрый EDA и согласование метрик с бизнесом; для повторяемой загрузки — Power Query (Power BI и self-service аналитика). См. Разведочный анализ данных в Excel.

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). Пакетная и распределённая обработка (chunk, MapReduce) — Пакетная работа с данными.


Частые отличия (не в таблице)

  • Соединение таблиц: в Pandas pd.merge(..., how="inner"|"left"|"right"|"outer"), в Polars и PySpark join(..., 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 должны совпадать по именам и совместимым типам.

См. также