Pandas对比Polars,语法和速度大PK

Pandas对比Polars,本文带你了解用于数据科学的Pandas和Polars库之间的主要区别。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

Pandas是数据科学中必不可少的Python库。但其最大的缺点是对大型数据集的操作速度较慢。Polars是一种旨在更快地处理数据的Pandas替代方案。

Polars是一种旨在更快地处理数据的Pandas替代方案。

本文简要介绍了Polars Python包,并将其与流行的数据科学库Pandas在语法和速度方面进行了比较。

  • 什么是Polars,为什么它比Pandas更快?

  • 基准测试设置

  • 开始使用Polars

  • Pandas和Polars的比较

  • ∘ 读取数据

  • ∘ 选择和过滤数据

  • ∘ 创建新列

  • ∘ 分组和聚合

  • ∘ 缺失数据

  • 结论

本文的相关代码可在Kaggle Notebook中找到,链接如下:

https://www.kaggle.com/code/iamleonie/pandas-vs-polars

什么是Polars,为什么它比Pandas更快?

根据Polars的用户指南[1],其目标是“提供一个利用计算机上所有可用核心的闪电般快速的DataFrame库。”

与Polars不同,Pandas不会在计算机核心之间进行原生的并行处理。其他工具如Dask是建立在Pandas库的基础上尝试进行并行处理。相反,Polars是专为并行化而设计的,并从头开始搭建。虽然它是用Rust编写的,但Polars有一个Python包,这使得它成为Pandas的潜在替代方案。

Polars有两种不同的API:急切API和惰性API。

急切的执行方式类似于Pandas。这意味着直接运行代码,并立即返回结果。

另一方面,惰性执行是在你需要结果时才运行。由于它避免了运行不必要的代码,因此惰性执行可以比急切执行更高效。

对于惰性执行,必须使用.lazy()方法开始操作。然后可以为你想做的任何事情编写要执行的代码。最后需要运行.collect()方法来显示结果。

df.lazy()
  .with_columns([(pl.col("col") * 10).alias("new_col")])
  #...
  .collect()

如果你不运行.collect()方法,则不会立即执行操作。相反,你将看到执行图。

图片

Polars惰性执行的示例执行图

基准测试设置

本基准测试设置使用了一个虚构的数据集,其中包含每种数据类型的一列。为了减少时间上的噪声以便进行比较,该虚构数据集包含400万行,几乎有1GB大小,正如[2]中建议的那样。

图片

用于比较Pandas和Polars基准测试的虚构数据集头部

在下文中,我们将使用%%timeit -n32 -r4对执行进行计时。

开始使用Polars

要设置Polars,只需使用pip安装它。

pip install polars

之后,可以像使用Pandas一样导入Polars Python包。

import polars as pl
import pandas as pd

现在,准备工作都已完成。

Pandas和Polars的比较

Pandas和Polars(急切API)在语法方面看起来很相似,因为它们具有共享的主要搭建模块:Series和DataFrames。

此外,Polars中的许多表达式也与Pandas表达式相似:

# 适用于Pandas和Polars的示例表达式
df.head() # 获取前n行的数据
df.tail() # 获取最后n行的数据
df.unique() # 获取此表达式的唯一值。

但是,根据Polars用户指南[1],“如果你的Polars代码看起来像是Pandas代码,它可能会运行,但很可能比它应该运行的速度慢。”

本节将探讨Polars包在语法和执行时间方面与Pandas的主要不同之处:

  • 读取数据

  • 选择和过滤数据

  • 创建新列

  • 分组和聚合

  • 缺失数据

读取数据

在Polars中读取CSV文件会感觉很熟悉,因为可以像在Pandas中一样使用.read_csv()方法:

# Pandas
pd.read_csv('example.csv')

# Polars
pl.read_csv('example.csv')

在Pandas和Polars中读取样本数据集的结果执行时间如下所示:

图片

Pandas和Polars之间读取时间的比较

对于我们的样本数据集,使用Pandas读取数据比使用Polars慢8倍左右。

选择和过滤数据

Pandas和Polars之间的第一个主要区别是Polars不使用索引[1]。相反,每行都以其在DataFrame中的整数位置为索引[1]。

虽然相同的Pandas代码也可以在Polars中运行,但这并不是最佳实践。在Polars中,应该使用.select()方法来选择数据。

# Pandas
df[['col1', 'col2']] 

# 上述代码也可以在Polars中运行,
# 但在Polars中的正确方式是:
df.select(pl.col(['col1', 'col2'])) 

在Pandas和Polars中选择数据的执行时间结果显示如下:

图片

Pandas和Polars之间选择时间的比较

对于我们的样本数据集,使用Pandas选择数据比使用Polars慢15倍左右(约为70.3微秒)。

下面比较了在文档中建议的Polars操作语法(使用.select(),左侧)和Pandas语法(使用df[['col1','col2']],右侧)。令人意外的是,Pandas语法比建议的.select()方法快得多。

图片

Polars和具有Pandas语法的Polars之间选择时间的比较(df[[‘col1’,‘col2’]]

在Pandas中,你可以使用.query()方法过滤数据,但在Polars中需要使用.filter()方法。

# Pandas
df.query('col1 > 5')

# Polars
df.filter(pl.col('col') > 5)

在Pandas和Polars中过滤数据的执行时间结果显示如下:

图片

Pandas和Polars之间过滤时间的比较

对于我们的样本数据集,使用Pandas和Polars过滤数据的时间大致相同。

与Pandas不同,Polars可以在.select().filter()中并行运行操作。

创建新列

在Polars中创建新列也与在Pandas中使用的方式有所不同。在Polars中,需要使用.with_column().with_columns()方法,具体取决于你要创建多少列。

# Pandas
df_pd["new_col"] = df_pd["col"] * 10

# Polars
df.with_columns([(pl.col("col") * 10).alias("new_col")])

# 多列的Polars
# df.with_columns([(pl.col("col") * 10).alias("new_col"), ...])

在Pandas和Polars中创建一个新列的结果执行时间如下:

图片

Pandas和Polars之间创建新列的时间比较

对于我们的样本数据集,在Polars中创建新列需要比Pandas长两倍左右的时间。

分组和聚合

在Pandas和Polars中,分组和聚合在语法上略有不同,但两者都使用.groupby().agg()方法。

# Pandas
df_pd.groupby('col1')['col2'].agg('mean')

# Polars
# df.groupby('col1').agg([pl.col('col2').mean()]) # 建议使用的Polars方法
df.groupby('col1').agg([pl.mean('col2')]) # 简短的语法

在Pandas和Polars中对数据进行分组和聚合的执行时间如下:

图片

Pandas和Polars之间聚合时间的比较

对于我们的样本数据集,使用Pandas聚合数据需要比使用Polars长两倍左右的时间。

缺失数据

Pandas和Polars之间的另一个主要区别是,Pandas使用NaN值表示缺失值,而Polars使用null[1]。

图片

Pandas和Polars如何在DataFrames中表示缺失值

因此,应该使用Polars的.fill_null()方法,而不是Pandas中的.fillna()方法。

# Pandas
df['col2'].fillna(-999)

# Polars
# df_pd.with_column(pl.col('col2').fill_null(pl.lit(-999))) # 建议使用的Polars方法
df_pd.with_column(pl.col('col2').fill_null(-999)) # 简短的语法

总结

那么,Polars是否比Pandas更好?Polars是否会取代Pandas?

Polars相对于Pandas的主要优势是速度。如果你需要在大型数据集上进行大量数据处理,那么你肯定应该尝试Polars。

Polars相对于Pandas的主要优势是速度。

但是,正如本文所示,如果要从Pandas切换到Polars,则需要学习新的Polars语法。此外,你已经看到,对于相同的操作,Polars代码通常要比Pandas代码长。并且,Polars并没有涵盖Pandas的所有功能,例如用于数据探索等。

因此,如果你需要使用Pandas提供的所有功能,则可能需要继续使用Pandas。

Polars的代码通常比Pandas的代码长。

参考文献

[1] Polars (2023): User Guide (accessed 8. January 2023)

【网址】:https://pola-rs.github.io/polars-book/user-guide/

[2] “Stackoverflow”, “What are the differences between feather and parquet?”. stackoverflow.com.(accessed July 25, 2022)

【网址】:https://stackoverflow.com/questions/48083405/what-are-the-differences-between-feather-and-parquet

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《Pandas1.x实例精解》

《Pandas1.x实例精解》详细阐述了与Pandas相关的基本解决方案,主要包括Pandas基础,DataFrame基本操作,创建和保留DataFrame,开始数据分析,探索性数据分析,选择数据子集,过滤行,对齐索引,分组以进行聚合、过滤和转换,将数据重组为规整形式,组合Pandas对象,时间序列分析,使用Matplotlib、Pandas和Seaborn进行可视化,调试和测试等内容。此外,该书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。《Pandas1.x实例精解》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

《Pandas1.x实例精解》icon-default.png?t=N7T8https://item.jd.com/13255935.html

图片

精彩回顾

《使用GeoPandas进行地理空间数据可视化》

《4个在Pandas DataFrame中进行元素比较的函数》

《活学活用Pandas,简化数据探索性分析》

《迭代vs向量化,如何提升Pandas性能?》

《云计算+数据科学,5步带你突破信息泛滥(下)》

《云计算+数据科学,5步带你突破信息泛滥(上)》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值