新闻中心
高效处理Polars LazyFrames的列级乘法操作(排除索引列)

本教程旨在指导用户如何在polars lazyframes中实现列级乘法操作,尤其是在需要排除一个共同索引列的情况下。文章将详细介绍如何利用polars的`struct`表达式将非索引列封装起来,并通过`join`操作对齐两个lazyframes,进而执行结构体之间的元素级乘法,最后使用`unnest`将结果展开,从而提供一个高效且符合polars范式的解决方案。
在数据处理领域,尤其是在从Pandas等工具迁移到Polars时,用户经常会遇到需要对两个结构相同、具有共同索引的数据集进行元素级运算的场景。例如,对两个DataFrame中除了时间索引列之外的所有对应数值列执行乘法。虽然在Pandas中,这通常可以通过简单的df1 * df2实现,但在Polars的LazyFrame环境中,由于其优化和表达式驱动的特性,需要采用一种更具Polars风格的方法来达到相同的效果。
场景描述与Polars中的挑战
假设我们有两个Polars LazyFrame,它们都包含一个time列作为时间索引,以及若干数值列(例如foo, bar, baz)。我们的目标是让df1中的foo列乘以df2中的foo列,df1中的bar列乘以df2中的bar列,依此类推,同时保留time列作为结果的索引。
首先,我们创建示例数据:
import polars as pl
import numpy as np
import pandas as pd
n = 5 # 示例数据行数
# 创建第一个LazyFrame
df1 = pl.DataFrame(data={
'time': pd.date_range('2025-01-01', periods=n, freq='1 min'),
'foo': np.random.uniform(0,127, size= n).astype(np.float64),
'bar': np.random.uniform(1e3,32767, size= n).astype(np.float64),
'baz': np.random.uniform(1e6,2147483, size= n).astype(np.float64)
}).lazy()
# 创建第二个LazyFrame
df2 = pl.DataFrame(data={
'time': pd.date_range('2025-01-01', periods=n, freq='1 min'),
'foo': np.random.uniform(0,127, size= n).astype(np.float64),
'bar': np.random.uniform(1e3,32767, size= n).astype(np.float64),
'baz': np.random.uniform(1e6,2147483, size= n).astype(np.float64)
}).lazy()
print("df1 示例数据:")
print(df1.collect())
print("\ndf2 示例数据:")
print(df2.collect())在Polars中,直接对LazyFrames执行df1 * df2并不能像Pandas那样自动进行基于列名的对齐和乘法。尝试使用pl.concat([df1, df2]).group_by('time').agg(pl.col("*").mul(pl.col("*")))等聚合操作,往往会因为聚合函数对列表的处理方式,导致结果不是我们期望的列级乘积,而是生成包含列表的复杂结构。
Polars 解决方案:结合 Structs 和 Join
Polars提供了一种强大且灵活的方式来处理这类跨DataFrame的列级操作,即利用结构体(struct)表达式和连接(join)操作。
整个解决方案可以分解为以下几个关键步骤:
1. 将非索引列封装为结构体
首先,我们需要将每个LazyFrame中除了time列之外的所有数值列封装到一个名为cols的结构体列中。这样做的好处是,可以将所有需要进行操作的列作为一个整体来处理,简化后续的乘法运算。
# 将df1的非时间列封装到结构体中
df1_struct = df1.select("time", cols=pl.struct(pl.exclude("time")))
# 将df2的非时间列封装到结构体中
df2_struct = df2.select("time", cols=pl.struct(pl.exclude("time")))
print("\ndf1 封装后的结构体示例:")
print(df1_struct.collect())通过pl.struct(pl.exclude("time"))表达式,我们指示Polars创建一个新的结构体列cols,其中包含除time列之外的所有其他列。
Whimsical
Whimsical推出的AI思维导图工具
182
查看详情
2. 通过索引列对齐两个结构体LazyFrame
接下来,我们需要将这两个包含结构体的LazyFrame基于共同的time列进行连接。这将确保来自df1和df2的对应行能够被正确地匹配起来。
# 基于time列进行左连接,对齐两个结构体LazyFrame
joined_df = df1_struct.join(
df2_struct,
on="time",
how="left"
)
print("\n连接后的LazyFrame示例:")
print(joined_df.collect())连接操作会生成一个包含time列、cols列(来自df1)和cols_right列(来自df2)的LazyFrame。此时,cols和cols_right是两个结构体列,它们在相同的time值上是相互对应的。
3. 执行结构体之间的元素级乘法
Polars允许直接对具有相同内部字段的结构体列执行元素级运算。这意味着我们可以直接将cols结构体列乘以cols_right结构体列,Polars会自动将其内部的对应字段进行乘法运算。
# 对结构体列执行元素级乘法
multiplied_struct_df = joined_df.select(
"time",
pl.col("cols") * pl.col("cols_right")
)
print("\n结构体乘法后的LazyFrame示例:")
print(multiplied_struct_df.collect())这一步会生成一个新的结构体列,其中每个字段的值都是原结构体中对应字段的乘积。
4. 展开结构体列以恢复原始列结构
最后一步是使用unnest()方法将乘法结果的结构体列展开,恢复成独立的列,从而得到与原始Pandas操作结果相似的扁平化DataFrame结构。
# 展开结构体列,得到最终结果
final_result = multiplied_struct_df.unnest("cols")
print("\n最终结果 LazyFrame:")
print(final_result.collect())完整代码示例
将上述步骤整合起来,我们得到以下完整的Polars LazyFrame列级乘法解决方案:
import polars as pl
import numpy as np
import pandas as pd
n = 5 # 示例数据行数
# 创建第一个LazyFrame
df1 = pl.DataFrame(data={
'time': pd.date_range('2025-01-01', periods=n, freq='1 min'),
'foo': np.random.uniform(0,127, size= n).astype(np.float64),
'bar': np.random.uniform(1e3,32767, size= n).astype(np.float64),
'baz': np.random.uniform(1e6,2147483, size= n).astype(np.float64)
}).lazy()
# 创建第二个LazyFrame
df2 = pl.DataFrame(data={
'time': pd.date_range('2025-01-01', periods=n, freq='1 min'),
'foo': np.random.uniform(0,127, size= n).astype(np.float64),
'bar': np.random.uniform(1e3,32767, size= n).astype(np.float64),
'baz': np.random.uniform(1e6,2147483, size= n).astype(np.float64)
}).lazy()
# 执行Polars LazyFrame列级乘法操作
result_df = (
df1.select("time", cols=pl.struct(pl.exclude("time"))) # 封装df1的非时间列
.join(
df2.select("time", cols=pl.struct(pl.exclude("time"))), # 封装df2的非时间列并连接
on = "time",
how = "left"
)
.select("time", pl.col("cols") * pl.col("cols_right")) # 对结构体列执行乘法
.unnest("cols") # 展开结果结构体
)
print("\n最终的Polars LazyFrame列级乘法结果:")
print(result_df.collect())注意事项与总结
- Polars范式: 这种利用struct和join的方法是Polars处理跨DataFrame复杂列级操作的典型范式。它在LazyFrame模式下表现出色,能够利用Polars的查询优化器进行高效计算。
- 灵活性: 这种方法不仅适用于乘法,也适用于其他元素级运算(加法、减法、除法等),只需将pl.col("cols") * pl.col("cols_right")替换为相应的运算符即可。
- 列名匹配: 确保两个LazyFrame中需要进行操作的列具有相同的名称,这样pl.exclude("time")才能正确地选择并封装对应的列。结构体之间的运算依赖于内部字段的名称匹配。
- 性能优势: 对于大型数据集,LazyFrame结合struct和join的策略能够避免不必要的中间计算和内存分配,从而提供显著的性能优势。
通过掌握这种技术,用户可以更自信地在Polars环境中实现复杂的跨DataFrame操作,充分发挥其高性能数据处理的能力。
以上就是高效处理Polars LazyFrames的列级乘法操作(排除索引列)的详细内容,更多请关注其它相关文章!
# 行数
# 营销宣传推广方案范文
# 肇庆网站建设app
# 简述营销推广的特点包括
# 推广网站怎么推广的呢
# 湘潭seo 就问磐石网络专业
# 直播网站建设总结
# 如何解读网站优化
# 做网站建设费用多少
# 网站优化工具的作用是
# seo综合查询爱
# 工具
# 都是
# 正确地
# 如何使用
# 数据处理
# 第二个
# 运算符
# 适用于
# 第一个
# 是在
# 聚合函数
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
单射、满射与双射的关系 一文理清所有逻辑
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
深入理解与实现最大堆的Heapify过程:常见错误与修正
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
FullCalendar 自定义按钮样式定制指南
网易大神账号申诉需要多久_网易大神账号申诉流程说明
海量存储:机器视觉智能化的核心基石
DLsite中文平台入口 DLsite官网内容在线查看
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
浏览器打开即用 美图秀秀网页版入口
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
可靠CSGO开箱平台解析 CSGO开箱网合集
React列表渲染与独立状态管理:避免全局状态影响局部更新
多闪网页版在线观看免费入口_多闪官网访问入口
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
在哪找SublimeJ远程工具_SFTP插件配置教程
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
C++如何实现单例模式_C++设计模式之线程安全的单例写法
AO3镜像入口大全 AO3网页版内容访问全集
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
Win11网速慢怎么解决 Win11网络设置优化解除限速
韩剧圈正版入口页面_韩剧圈官网登录链接
Go RPC HTTP服务正确实现与常见陷阱解析
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
《主播少女的秘密账号迷宫》首支宣传片
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
怎么在mac上运行html代码_mac运行html代码方法【指南】
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
Django通过AJAX异步上传图片并保存至模型的完整指南
AngularJS $http POST请求数据传递与Go后端接收实践
抓大鹅解压小游戏 抓大鹅摸鱼解压入口
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
CSS子选择器:如何区分并样式化嵌套列表的子层级
动漫岛观看全网网 动漫岛在线正版动漫入口


2025-11-15
浏览次数:次
返回列表