说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
polars
是一个用于数据处理的 Python 三方库,它的设计目标是提供比 pandas 更高效的操作,尤其是在处理大型数据集时。polars
是一个以列为导向(columnar)的数据框架库,与 pandas 类似,但由于采用了 Rust 语言编写的底层实现,polars
通常能够在速度和内存使用方面提供更好的性能。
polars
的主要特点性能优化:polars
是用 Rust 编写的,这使得它在性能上有很大的提升,尤其是在大数据集的处理上。
多线程:polars
支持多线程处理,这意味着在处理数据时可以利用多核 CPU 来加速操作。
内存效率:polars
采用了列式存储(columnar storage),这一点与 pandas 的行式存储(row-based storage)不同。这种存储方式在处理大数据集时可以显著减少内存占用。
类似于 SQL 的查询:polars
支持类似 SQL 的查询操作,比如 group by、join、filter 等,这些操作可以通过链式方法调用来实现,语法简单且直观。
与 pandas 兼容:polars
提供了与 pandas 兼容的接口,可以方便地从 pandas 迁移到 polars
。
polars
要安装 polars
,可以使用 pip:
pip install polars
你可以像在 pandas 中一样创建一个 DataFrame
,但使用的是 polars
的接口:
import polars as pl
# 创建一个 DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["New York", "Los Angeles", "Chicago"]
})
print(df)
输出:
shape: (3, 3)
┌─────────┬─────┬─────────────┐
│ name │ age │ city │
│ --- │ --- │ --- │
│ str │ i64 │ str │
├─────────┼─────┼─────────────┤
│ Alice │ 25 │ New York │
│ Bob │ 30 │ Los Angeles │
│ Charlie │ 35 │ Chicago │
└─────────┴─────┴─────────────┘
df = df.select(["name", "age"])
print(df)
输出:
shape: (3, 2)
┌─────────┬─────┐
│ name │ age │
│ --- │ --- │
│ str │ i64 │
├─────────┼─────┤
│ Alice │ 25 │
│ Bob │ 30 │
│ Charlie │ 35 │
└─────────┴─────┘
df_filtered = df.filter(pl.col("age") > 30)
print(df_filtered)
输出:
shape: (1, 2)
┌─────────┬─────┐
│ name │ age │
│ --- │ --- │
│ str │ i64 │
├─────────┼─────┤
│ Charlie │ 35 │
└─────────┴─────┘
df_aggregated = df.group_by("city").agg([
pl.col("age").mean().alias("avg_age")
])
print(df_aggregated)
这个例子展示了如何通过 polars
来进行数据的基本操作。polars
的 API 与 pandas 有很多相似之处,但由于其底层实现的不同,它在处理大数据集时会有显著的性能提升。
下面我将展示一些更复杂的 polars
使用示例,包括排序、连接(join)、数据类型转换、以及窗口函数的使用。
import polars as pl
# 创建一个 DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie", "David"],
"age": [25, 30, 35, 28],
"salary": [70000, 80000, 120000, 95000]
})
# 按照年龄排序
df_sorted = df.sort("age", descending=True)
print(df_sorted)
输出:
shape: (4, 3)
┌─────────┬─────┬────────┐
│ name │ age │ salary │
│ --- │ --- │ --- │
│ str │ i64 │ i64 │
├─────────┼─────┼────────┤
│ Charlie │ 35 │ 120000 │
│ David │ 28 │ 95000 │
│ Bob │ 30 │ 80000 │
│ Alice │ 25 │ 70000 │
└─────────┴─────┴────────┘
# 创建两个 DataFrame
df_left = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"department": ["HR", "IT", "Finance"]
})
df_right = pl.DataFrame({
"name": ["Alice", "Bob", "David"],
"salary": [70000, 80000, 95000]
})
# 进行左连接
df_joined = df_left.join(df_right, on="name", how="left")
print(df_joined)
输出:
shape: (3, 3)
┌─────────┬────────────┬────────┐
│ name │ department │ salary │
│ --- │ --- │ --- │
│ str │ str │ i64 │
├─────────┼────────────┼────────┤
│ Alice │ HR │ 70000 │
│ Bob │ IT │ 80000 │
│ Charlie │ Finance │ null │
└─────────┴────────────┴────────┘
# 创建一个 DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": ["25", "30", "35"]
})
# 将 age 列转换为整数类型
df = df.with_columns([
pl.col("age").cast(pl.Int64)
])
print(df)
输出:
shape: (3, 2)
┌─────────┬─────┐
│ name │ age │
│ --- │ --- │
│ str │ i64 │
├─────────┼─────┤
│ Alice │ 25 │
│ Bob │ 30 │
│ Charlie │ 35 │
└─────────┴─────┘
# 创建一个 DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie", "David"],
"department": ["HR", "IT", "Finance", "IT"],
"salary": [70000, 80000, 120000, 95000]
})
# 计算每个部门的累计薪资
df = df.with_columns([
pl.col("salary").cum_sum().over("department").alias("cumulative_salary")
])
print(df)
输出:
shape: (4, 4)
┌─────────┬────────────┬────────┬─────────────────┐
│ name │ department │ salary │ cumulative_salary │
│ --- │ --- │ --- │ --- │
│ str │ str │ i64 │ i64 │
├─────────┼────────────┼────────┼─────────────────┤
│ Alice │ HR │ 70000 │ 70000 │
│ Bob │ IT │ 80000 │ 80000 │
│ David │ IT │ 95000 │ 175000 │
│ Charlie │ Finance │ 120000 │ 120000 │
└─────────┴────────────┴────────┴─────────────────┘
# 创建一个 DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie", "David"],
"age": [25, 30, 35, 28],
"salary": [70000, 80000, 120000, 95000]
})
# 筛选出年龄大于30并且薪资大于90000的员工
df_filtered = df.filter((pl.col("age") > 30) & (pl.col("salary") > 90000))
print(df_filtered)
输出:
shape: (1, 3)
┌─────────┬─────┬────────┐
│ name │ age │ salary │
│ --- │ --- │ --- │
│ str │ i64 │ i64 │
├─────────┼─────┼────────┤
│ Charlie │ 35 │ 120000 │
└─────────┴─────┴────────┘
# 创建一个 DataFrame
df = pl.DataFrame({
"department": ["HR", "IT", "Finance", "IT", "HR", "Finance"],
"name": ["Alice", "Bob", "Charlie", "David", "Eve", "Frank"],
"salary": [70000, 80000, 120000, 95000, 75000, 130000]
})
# 生成数据透视表,按部门汇总平均薪资
pivot_df = df.group_by("department").agg([
pl.col("salary").mean().alias("avg_salary")
])
print(pivot_df)
输出:
shape: (3, 2)
┌────────────┬────────────┐
│ department │ avg_salary │
│ --- │ --- │
│ str │ f64 │
├────────────┼────────────┤
│ HR │ 72500.0 │
│ IT │ 87500.0 │
│ Finance │ 125000.0 │
└────────────┴────────────┘
这些示例展示了 polars
的一些核心功能及其灵活性。你可以看到,polars
提供了类似于 pandas 的 API,但在某些情况下表现更好,尤其是处理大数据集时。
更新时间:2024-08-11 22:18:05 标签:python 数据 polars