Pandas和Polars之间语法和速度比较

news2025/4/21 15:03:21

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

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

 Polars简介

根据Polars的用户指南,其目标是“提供一个利用计算机上所有可用核心的闪电般快速的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()方法,则不会立即执行操作。相反,你将看到执行图。

 基准测试设置

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

 在下文中,我们将使用%%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用户指南,“如果你的Polars代码看起来像是Pandas代码,它可能会运行,但很可能比它应该运行的速度慢。”

  • 读取数据

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

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

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

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

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

  • 选择和过滤数据

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

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

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

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

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

 

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

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

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

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

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

在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中创建一个新列的结果执行时间如下:

 对于我们的样本数据集,在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长两倍左右的时间。

总结

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

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

因此,如果你需要使用Pandas提供的所有功能,则可能需要继续使用Pandas,Polars的代码通常比Pandas的代码长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring WebFlux 实现原理与架构图

启动原理与架构图 通过spring-boot-autoconfigure中的spring.factories文件,通过Spring Boot自动初始化下列类:HttpHandlerAutoConfiguration、ReactiveWebServerFactoryAutoConfiguration、WebFluxAutoConfiguration、ErrorWebFluxAutoConfiguration、…

问题解决:idea克隆项目依赖无法解析

问题描述尝试解决方案 问题描述 从git远程仓库clone了一个springboot项目, 然后项目的pom.xml文件的依赖全部加载失败,全部是Project 某某某依赖 not found 的错误,几十条 代码就更不用看了,只要用到依赖,全部报错. 看着报错就头大 尝试解决方案 检查maven配置是否正确 检查是…

国内首个多主架构方案发布:数据库产业生态的一次开放式升维

文 | 智能相对论 作者 | 叶远风 作为数字化变革最仰仗的基础设施之一,数据库的建设已经成为当下的热点。 长期以来,通过数据库的自主创新来保证数据基础设施的安全可控,一直是业界以及众多行业客户的普遍愿望。 但是,这一进程…

TP4056充电管理芯片使用详解

一.芯片简介 TP4056充电管理芯片是一款常用的单节锂电池恒定电流/恒定电压线性充电管理芯片。 内部电路框图如下: 芯片采用了内部 PMOSFET 架构,加上防倒充电路,无需增加外部隔离二极管。热反馈可对充电电流进行自动调节,以便在…

【Docker】error pulling image configuration: download failed after attempts=6: dial tc

问题&#xff1a;在学习Docker的时候遇到pull失败的情况 解决方法&#xff1a; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"] } EOF sudo systemctl daemon…

【Visual Studio】在 Windows 上使用 Visual Studio 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 1 版本环境2 构建步骤1 准备文件夹结构2 运行 CMake3 在 Visual Studio 中构建4 安装 VTK5 再次在 Visual Studio 中构建6 添加环境变量 3 测试是否…

基于妙记多 Mojidoc 剪藏内容和内容创建的工作流程

早在我开始创作之前&#xff0c;我就是一个信息消费者——收集想法和想法&#xff0c;但不对它们做任何事情。这给了我很多创建信息捕获和综合系统的经验。直到现在&#xff0c;我才有了适当的方法来分析我是如何做到的… 这是一个工作流程&#xff0c;可以在较多杂乱信息中增…

【Java】面向对象基础 之 静态字段和静态方法

1、静态字段 在一个class中定义的字段&#xff0c;我们称之为实例字段。实例字段的特点是&#xff0c;每个实例都有独立的字段&#xff0c;各个实例的同名字段互不影响。 还有一种字段&#xff0c;是用static修饰的字段&#xff0c;称为静态字段&#xff1a;static field。 …

Kkfileview | Docker | +Redis文件预览kkfile配置

文章目录 简介DockerRedis部署 简介 kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 …

【Excel导出文件】

文章目录 课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 2. Apache POI2.1 介绍2.2 入门案例2.2.1 将数据写…

微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明

微信小程序中的条件渲染和列表渲染 1. 条件渲染1.1. 语法格式 (wx:if, wx:elif ,wx:else)1.2. block标记1.3. hidden属性1.4. wx:if 与 hidden 的对比 2. 列表渲染2.1. wx:for 语法格式 及 wx:key的使用 1. 条件渲染 1.1. 语法格式 (wx:if, wx:elif ,wx:else) <view wx:if…

Vue+element-UI实现列表排序(sortable、custom)

1.sortable、custom区别&#xff1a; 在列中设置sortable属性即可实现以该列为基准的排序&#xff0c;接受一个Boolean&#xff0c;默认为false。 可以通过 Table 的default-sort属性设置默认的排序列和排序顺序。 可以使用sort-method或者sort-by使用自定义的排序规则。 如…

大数据Hive篇:explode 和 posexplode

一. explode单独使用。 1.1. 用于array类型的数据 table_name 表名array_col 为数组类型的字段new_col array_col被explode之后对应的列 select explode(array_col) as new_col from table_name1.2. 用于map类型的数据 由于map是kay-value结构的&#xff0c;所以它在转换的…

跨平台低延迟RTSP转RTMP推送技术方案探讨

实现RTSP摄像头数据转RTMP推送到服务器&#xff0c;可以用第三方库或者工具实现&#xff0c;总体设计架构如下&#xff1a; 一个好的转发模块&#xff0c;首先要低延迟&#xff01;其次足够稳定、灵活、有状态反馈机制、资源占用低&#xff0c;跨平台&#xff0c;最好以接口形式…

使用python get post数据 http https

0、目的 目的比较简单&#xff0c;测试&#xff0c;使用python来提交数据是非常简洁的&#xff0c;修改代码也容易&#xff0c;除了做人工智能&#xff0c;本身也是一个非常好的测试端工具 1、简单的post 一个简单的示例程序&#xff0c;将 headers 内容置为’application/j…

C#轻松读写NDEF智能海报

NDEF 全称 NFC data exchange format 即 nfc 数据交换格式&#xff0c;是一种标准化的数据格式&#xff0c;可用于在任何兼容的NFC设备与另一个NFC设备或标签之间交换信息。数据格式由NDEF消息和NDEF记录组成。 NDEF信息可以写到不同类型的NFC芯片中&#xff0c;如Ntag系列芯片…

Python算法笔记(1)-时间复杂度、空间复杂度

Python算法笔记&#xff08;1&#xff09;-时间复杂度 1.时间复杂度 时间复杂度是一个描述算法的运行时间的一个函数&#xff0c;它描述了算法的运行时间和输入数据的规模之间的关系&#xff0c;时间复杂度的表示方法用O表示&#xff0c;时间复杂度也用来考察输入值无限趋近无…

【嵌入式Qt开发入门】Qt如何使用多线程——继承QObject的线程

QObject 在上篇已经说过&#xff0c;继承 QThread 类是创建线程的一种方法&#xff0c;另一种就是继承 QObject 类。继承 QObject 类更加灵活。它通过 QObject::moveToThread()方法&#xff0c;将一个 QObeject 的类转移到一个线程里执行&#xff0c;可以通过下图理解。 通过…

注解和反射02(Java)

反射机制 首先需了解静态语言和动态语言。 动态语言是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言&a…

一文解析Arm64 栈回溯

AArch64栈的结构 Arm64有4种栈&#xff0c;分别是空增栈(Empty Ascendant Stack,EA)、空减栈(Empty Descendant Stack,ED)、满增栈(Full Ascendant Stack,FA)、满减栈(Full Descendant Stack,FD)。常用的是满减栈&#xff0c;Linux内核也使用满减栈。 下图是一个满减栈的示意…