[ PROMPT_NODE_26422 ]
dataframes
[ SKILL_DOCUMENTATION ]
# Dask DataFrames
## 概述
Dask DataFrames 通过跨多个 pandas DataFrames 分配工作,实现了大规模表格数据的并行处理。正如文档所述,“Dask DataFrames 是许多 pandas DataFrames 的集合”,具有相同的 API,使得从 pandas 的过渡非常直接。
## 核心概念
Dask DataFrame 沿索引划分为多个 pandas DataFrames(分区):
- 每个分区都是一个常规的 pandas DataFrame
- 操作并行应用于每个分区
- 结果自动合并
## 关键能力
### 扩展性
- 在笔记本电脑上处理 100 GiB
- 在集群上处理 100 TiB
- 处理超出可用内存的数据集
### 兼容性
- 实现了大部分 pandas API
- 从 pandas 代码轻松过渡
- 使用熟悉的 API 进行操作
## 何时使用 Dask DataFrames
**在以下情况使用 Dask**:
- 数据集超出可用内存
- 计算需要大量时间,且 pandas 优化无效
- 需要从原型(pandas)扩展到生产(更大规模数据)
- 处理需要一起处理的多个文件
**在以下情况坚持使用 Pandas**:
- 数据可以轻松放入内存
- 计算在亚秒级完成
- 没有自定义 `.apply()` 函数的简单操作
- 迭代开发和探索
## 读取数据
Dask 镜像了 pandas 的读取语法,并增加了对多个文件的支持:
### 单个文件
python
import dask.dataframe as dd
# 读取单个文件
ddf = dd.read_csv('data.csv')
ddf = dd.read_parquet('data.parquet')
### 多个文件
python
# 使用 glob 模式读取多个文件
ddf = dd.read_csv('data/*.csv')
ddf = dd.read_parquet('s3://mybucket/data/*.parquet')
# 使用路径结构读取
ddf = dd.read_parquet('data/year=*/month=*/day=*.parquet')
### 优化
python
# 指定要读取的列(减少内存)
ddf = dd.read_parquet('data.parquet', columns=['col1', 'col2'])
# 控制分区
ddf = dd.read_csv('data.csv', blocksize='64MB') # 创建 64MB 的分区
## 常见操作
所有操作都是惰性的,直到调用 `.compute()`。
### 过滤
python
# 与 pandas 相同
filtered = ddf[ddf['column'] > 100]
filtered = ddf.query('column > 100')
### 列操作
python
# 添加列
ddf['new_column'] = ddf['col1'] + ddf['col2']
# 选择列
subset = ddf[['col1', 'col2', 'col3']]
# 删除列
ddf = ddf.drop(columns=['unnecessary_col'])
### 聚合
python
# 标准聚合