Python库Polars简介及教程
简介
Polars是一个高性能的DataFrame库,专为处理大型数据集和进行复杂数据操作而设计。与传统的pandas库相比,Polars在速度和内存效率方面具有显著优势。这得益于其底层基于Apache Arrow的列式存储格式和Rust编写的核心引擎,使得Polars在处理数据时更加高效。
主要特点
- 高性能:通过并行处理和优化的数据结构,Polars能够极大地提升数据操作速度。
- 低内存消耗:利用Apache Arrow的列式存储格式,Polars在处理大数据时内存占用更低。
- 简洁API:提供类似pandas的API,易于上手,同时支持更多高级功能。
- 灵活性:支持复杂的数据操作和查询,适合大数据分析和机器学习前的数据处理。
为什么要放弃Pandas改用Polars?
1. 性能和内存效率
Polars 采用Rust编写和Apache Arrow列式存储格式,支持并行计算,这使得它在处理大数据集时表现出色。相比之下,Pandas 使用Python编写,虽然功能全面,但在处理大数据时性能和内存使用效率较低。
2. 计算速度
Polars的并行计算能力使得在处理数据时更快,尤其是在执行复杂的查询和数据操作时。Pandas则是单线程计算,在大数据集下可能会遇到性能瓶颈。
3. API设计
Polars提供类似Pandas的API,但支持链式操作和懒加载,这使得代码更加简洁和高效。虽然Pandas的API设计成熟且功能全面,但在某些复杂操作上需要更多的代码来实现。
4. 内存管理
Polars利用Apache Arrow的列式存储格式,能够有效降低内存消耗。这对于处理内存受限的大数据集特别有用。Pandas则采用行式存储,在处理大数据时内存使用较高。
5. 灵活性和扩展性
Polars不仅适合数据分析,还能轻松扩展到机器学习前的数据处理。而且,Polars与其他高性能计算工具(如Apache Arrow)有很好的兼容性。Pandas虽然也很灵活,但在某些高性能需求的场景下,Polars表现更为出色。
安装
要安装Polars,可以使用pip:
pip install polars
教程
以下是如何使用Polars进行基本数据操作的教程。
1. 导入库
In [1]:
import polars as pl
2. 创建DataFrame
创建一个简单的DataFrame:
In [2]:
# 创建DataFrame data = { "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35], "city": ["New York", "Los Angeles", "Chicago"] } df = pl.DataFrame(data) print(df)
shape: (3, 3) ┌─────────┬─────┬─────────────┐ │ name ┆ age ┆ city │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞═════════╪═════╪═════════════╡ │ Alice ┆ 25 ┆ New York │ │ Bob ┆ 30 ┆ Los Angeles │ │ Charlie ┆ 35 ┆ Chicago │ └─────────┴─────┴─────────────┘
3. 数据选择
选择DataFrame中的特定列:
In [3]:
age_city_df = df.select(["age", "city"]) print(age_city_df)
shape: (3, 2) ┌─────┬─────────────┐ │ age ┆ city │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════════════╡ │ 25 ┆ New York │ │ 30 ┆ Los Angeles │ │ 35 ┆ Chicago │ └─────┴─────────────┘
4. 过滤数据
根据条件过滤数据:
In [4]:
# 过滤数据 filtered_df = df.filter(pl.col("age") > 30) print(filtered_df)
shape: (1, 3) ┌─────────┬─────┬─────────┐ │ name ┆ age ┆ city │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞═════════╪═════╪═════════╡ │ Charlie ┆ 35 ┆ Chicago │ └─────────┴─────┴─────────┘
5. 数据聚合
对数据进行聚合操作:
In [5]:
# 聚合数据 grouped_df = df.group_by("city").agg([ pl.col("age").mean().alias("average_age") ]) print(grouped_df)
shape: (3, 2) ┌─────────────┬─────────────┐ │ city ┆ average_age │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═════════════╪═════════════╡ │ Chicago ┆ 35.0 │ │ New York ┆ 25.0 │ │ Los Angeles ┆ 30.0 │ └─────────────┴─────────────┘
6. 数据连接
连接两个DataFrame:
In [6]:
# 创建第二个DataFrame data2 = { "city": ["New York", "Los Angeles", "Chicago"], "population": [8000000, 4000000, 2700000] } df2 = pl.DataFrame(data2) # 连接DataFrame joined_df = df.join(df2, on="city") print(joined_df)
shape: (3, 4) ┌─────────┬─────┬─────────────┬────────────┐ │ name ┆ age ┆ city ┆ population │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ i64 │ ╞═════════╪═════╪═════════════╪════════════╡ │ Alice ┆ 25 ┆ New York ┆ 8000000 │ │ Bob ┆ 30 ┆ Los Angeles ┆ 4000000 │ │ Charlie ┆ 35 ┆ Chicago ┆ 2700000 │ └─────────┴─────┴─────────────┴────────────┘
结论
Polars通过其高性能和低内存消耗,成为处理大数据集和进行复杂数据操作的理想选择。无论是基本的数据操作,还是复杂的数据查询和聚合,Polars都提供了强大的功能和简洁的API。