进阶版的Pandas数据分析神器:Polars

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是一个很好的选择,并且可以帮助我们提高数据处理速度和内存使用效率。

后端开发标签