核心内容
当数据量超出单机 pandas 能力时,可集成 Dask、Modin、Vaex 处理超大数据集,以及与 Polars 互转获得更优性能。
一、与 Dask 集成
Dask 提供 DataFrame 的并行化版本,支持多核、分布式、超出内存的数据集。
import dask.dataframe as dd
# 从 pandas 创建
pdf = pd.DataFrame({'a': range(100), 'b': range(100)})
ddf = dd.from_pandas(pdf, npartitions=4)
# 直接读取大型 CSV(自动分块并行)
ddf = dd.read_csv('huge_*.csv')
# 延迟计算:链式操作不会立即执行
result = ddf.groupby('group')['value'].sum()
# 触发计算并转回 pandas
pdf_result = result.compute()| Dask 特性 | 说明 |
|---|---|
| 惰性求值 | 操作先构建计算图,compute() 时才执行 |
| 分区并行 | 按 npartitions 自动并行 |
| 超出内存 | 数据可在磁盘 / 分布式存储 |
| 类 pandas API | groupby / merge / apply 均可使用 |
转换
# pandas → dask
ddf = dd.from_pandas(df, npartitions=8)
# dask → pandas
df = ddf.compute()二、与 Modin 集成
Modin 通过 Ray 或 Dask 后端并行化 pandas API,几乎无需改代码。
# 安装:pip install "modin[ray]" 或 "modin[dask]"
import modin.pandas as pd # 直接替换 pandas
# 用法与 pandas 相同,底层自动并行
df = pd.read_csv('huge.csv')
result = df.groupby('group')['value'].sum()# 设置后端
export MODIN_ENGINE=ray # 或 dask
export MODIN_NPARTITIONS=16 # 分区数适用性
Modin 对常见 DataFrame 操作(read_csv、apply、groupby)有较好加速;个别操作仍可能回退到 pandas 单线程。
三、与 Vaex 集成
Vaex 专为超大表格设计,采用**内存映射(memory-mapped)**技术,可秒级打开百 GB 级 HDF5 / Arrow 文件。
import vaex
# 从 pandas 转换
vdf = vaex.from_pandas(df)
# 打开大型 HDF5 / Arrow 文件
vdf = vaex.open('huge.hdf5')
# Vaex 惰性表达式
result = vdf[vdf['value'] > 100].groupby(vdf['group'], agg='mean')
# 转回 pandas
pdf = vdf.to_pandas_df()| 特性 | 说明 |
|---|---|
| 惰性求值 | 表达式延迟到需要时计算 |
| 零拷贝 | 内存映射,不占额外内存 |
| 支持超大文件 | 数百 GB 级 |
| 内置可视化 | vdf.plot() 快速探索 |
四、与 Polars 转换
Polars 是 Rust 实现的极速 DataFrame 库,与 pandas 双向转换非常容易。
Polars → pandas
import polars as pl
# 构建 Polars DataFrame
pdf = pl.DataFrame({
'a': [1, 2, 3],
'b': ['x', 'y', 'z']
})
# 转换为 pandas
df = pdf.to_pandas()pandas → Polars
# 方式 1:自动推断 dtype
pldf = pl.from_pandas(df)
# 方式 2:指定 schema(推荐,避免 object 推断开销)
pldf = pl.from_pandas(df, schema_overrides={'id': pl.Int32})
# 方式 3:通过 Arrow 零拷贝(推荐大数据量)
import pyarrow as pa
arrow_table = pa.Table.from_pandas(df)
pldf = pl.from_arrow(arrow_table)
# 方式 4:将 pandas 对象放入 Polars 名前空间
pldf = df.to_polars() # pandas 2.3 内置性能对比建议
| 场景 | 推荐 |
|---|---|
| 常规分析(< 内存) | pandas |
| 超大数据(> 内存) | Dask / Vaex |
| 追求极致单机性能 | Polars |
| 并行 apply | Modin / swifter |
| 大规模字符串处理 | Polars 或 PyArrow 字符串 |
在 pandas 中调用 Polars 加速
# 将复杂 chain 操作转 Polars 执行后转回 import polars as pl df = pl.from_pandas(df) \ .filter(pl.col('a') > 0) \ .group_by('b') \ .agg(pl.col('c').mean()) \ .to_pandas()
相关笔记
- 21.3 内存分析与分块读取 - 在集成第三方库前先优化单机方案
- Pandas-十三-Arrow 与高性能数据类型 - Arrow 是多个库互操作的基础
- Pandas-二十一-并行处理工具 - 单机多进程方案