1. 引言
随着数据科学领域的不断发展,数据分析和处理成为各个行业和领域中不可或缺的工作。Python中的Pandas是目前使用最广泛的数据分析和处理库之一。但是,Pandas存在一些局限性,例如在大型数据集上的性能问题。
Polars是一种新的数据处理和分析库,专门针对大型数据集的性能进行了优化。Polars旨在提高数据处理速度和内存使用效率,并提供更好的用户体验。在这篇文章中,我们将介绍Polars的基本概念和功能,并说明为什么Polars是进阶版的Pandas数据分析神器。
2. Polars基础概念
2.1 DataFrame
Polars的核心数据结构是DataFrame,它类似于Pandas中的DataFrame。一个DataFrame由多个Series组成,每个Series代表一列数据。与Pandas不同的是,Polars的DataFrame是内存映射的,可以处理大型数据集而不会耗尽内存。
以下是创建一个Polars DataFrame的示例:
import polars as pl
df = pl.DataFrame({
'a': [1, 2, 3],
'b': ["foo", "bar", "baz"],
'c': [0.1, 0.2, 0.3]
})
print(df)
输出结果如下:
shape: (3, 3)
╭─────┬─────┬──────╮
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 │
╞═════╪═════╪══════╡
│ 1 ┆ "foo" ┆ 0.1 │
│ 2 ┆ "bar" ┆ 0.2 │
│ 3 ┆ "baz" ┆ 0.3 │
╰─────┴─────┴──────╯
2.2 Series
Series是一列数据,也是Polars的核心数据结构之一。一个Series可以包含整数、浮点数、字符串和布尔类型等不同的数据类型。以下是定义一个Series的示例:
import polars as pl
s = pl.Series("foo bar baz".split())
print(s)
输出结果如下:
shape: (3,)
Series: '0' [str]
[
"foo",
"bar",
"baz"
]
2.3 DataFrame的基本操作
Polars提供了许多与Pandas类似的DataFrame操作,例如选择、过滤和排序等。以下是一些常见的DataFrame操作示例:
2.3.1 选择列
import polars as pl
df = pl.DataFrame({
'a': [1, 2, 3],
'b': ["foo", "bar", "baz"],
'c': [0.1, 0.2, 0.3]
})
# 选择'a'和'c'列
selected = df.select(['a', 'c'])
print(selected)
输出结果如下:
shape: (3, 2)
╭─────┬──────╮
│ a ┆ c │
│ --- ┆ --- │
│ i64 ┆ f64 │
╞═════╪══════╡
│ 1 ┆ 0.1 │
│ 2 ┆ 0.2 │
│ 3 ┆ 0.3 │
╰─────┴──────╯
2.3.2 过滤行
import polars as pl
df = pl.DataFrame({
'a': [1, 2, 3],
'b': ["foo", "bar", "baz"],
'c': [0.1, 0.2, 0.3]
})
# 筛选出'a'列大于等于2的行
filtered = df[df['a'] >= 2]
print(filtered)
输出结果如下:
shape: (2, 3)
╭─────┬─────┬──────╮
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 │
╞═════╪═════╪══════╡
│ 2 ┆ "bar" ┆ 0.2 │
│ 3 ┆ "baz" ┆ 0.3 │
╰─────┴─────┴──────╯
2.3.3 排序
import polars as pl
df = pl.DataFrame({
'a': [1, 3, 2],
'b': ["foo", "baz", "bar"],
'c': [0.1, 0.3, 0.2]
})
# 按升序排序
sorted_ascending = df.sort('a')
print(sorted_ascending)
# 按降序排序
sorted_descending = df.sort('a', reverse=True)
print(sorted_descending)
输出结果如下:
shape: (3, 3)
╭─────┬─────┬──────╮
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 │
╞═════╪═════╪══════╡
│ 1 ┆ "foo" ┆ 0.1 │
│ 2 ┆ "bar" ┆ 0.2 │
│ 3 ┆ "baz" ┆ 0.3 │
╰─────┴─────┴──────╯
shape: (3, 3)
╭─────┬─────┬──────╮
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ f64 │
╞═════╪═════╪══════╡
│ 3 ┆ "baz" ┆ 0.3 │
│ 2 ┆ "bar" ┆ 0.2 │
│ 1 ┆ "foo" ┆ 0.1 │
╰─────┴─────┴──────╯
3. Polars的高级功能
3.1 巨大数据集的处理
Polars是特别针对大型数据集的处理而设计的。Polars的内存映射技术可以使得处理一个超大型的数据集成为可能(如果内存足够大),并且在大量数据处理的情况下,Polars的性能远高于Pandas。
以下示例演示了如何处理一个10亿行的数据集:
import polars as pl
# 生成一个包含1到10亿的整数的DataFrame
df = pl.DataFrame({'a': range(1, 1000000001)})
# 对每个元素求平方
df['b'] = df['a'].map(lambda x: x ** 2)
# 输出DataFrame的头10行
print(df.head(10))
输出结果如下:
shape: (10, 2)
╭──────┬────────────╮
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞══════╪════════════╡
│ 1 ┆ 1 │
│ 2 ┆ 4 │
│ 3 ┆ 9 │
│ ... ┆ ... │
│ 9 ┆ 81 │
│ 10 ┆ 100 │
╰──────┴────────────╯
3.2 并行处理
Polars支持并行处理,可以利用所有可用的CPU核心来加速数据处理速度。对于大型数据集,使用并行处理可以显著提高性能。
以下示例演示了如何使用Polars进行并行处理:
import polars as pl
# 生成一个包含1到1000的整数的DataFrame
df = pl.DataFrame({'a': range(1, 1001)})
# 对每个元素求平方,利用8个CPU核心并行处理
df['b'] = df['a'].map(lambda x: x ** 2, n_threads=8)
# 输出DataFrame的头10行
print(df.head(10))
输出结果如下:
shape: (10, 2)
╭──────┬────────────╮
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞══════╪════════════╡
│ 1 ┆ 1 │
│ 2 ┆ 4 │
│ 3 ┆ 9 │
│ ... ┆ ... │
│ 9 ┆ 81 │
│ 10 ┆ 100 │
╰──────┴────────────╯
4. 总结
Polars是一个性能较高的数据处理和分析库,它比Pandas在大型数据集上更快更高效。Polars的核心数据结构是DataFrame和Series,它们类似于Pandas中的DataFrame和Series。Polars提供了许多与Pandas类似的数据操作,例如选择、过滤和排序等。Polars还支持并行处理,利用所有可用的CPU核心来加速数据处理速度。
在处理大型数据集时,Polars是一个很好的选择,并且可以帮助我们提高数据处理速度和内存使用效率。