
本教程详细阐述了如何在polars中实现复杂的条件排序,特别适用于根据模型预测结果和置信度对数据进行优先级排序的场景。通过巧妙结合布尔表达式、算术运算和多键排序,polars能够高效地将数据按“高置信度错误预测”、“低置信度错误预测”以及“从低到高置信度的正确预测”进行分组和排序,避免了传统的分拆合并操作,极大提升了数据处理的优雅性和效率。
在数据分析和机器学习模型评估中,我们经常需要对数据进行复杂的条件排序,以便优先关注某些特定模式的样本。例如,在二分类任务中,可能需要优先审查那些模型预测错误但置信度高的样本,以及预测正确但置信度低的样本,以发现模型潜在的改进点。传统的做法可能涉及将数据集拆分成多个子集,分别排序后再合并,但这往往会导致代码冗长且效率低下。Polars作为一个高性能的DataFrame库,提供了强大且富有表达力的API,可以优雅地解决这类复杂排序问题。
Polars的DataFrame.sort()方法支持传入一个表达式列表作为排序键。这意味着我们可以定义多个排序规则,Polars会按照这些表达式在列表中的顺序依次进行排序。一个关键的特性是,Polars中的布尔值(True和False)在算术运算中会被隐式转换为整数(1和0)。这一特性为实现条件排序提供了极大的灵活性。
为了实现“高置信度错误预测优先,其次是低置信度正确预测”的排序逻辑,我们将构建三个关键的排序表达式。
首先,我们创建一个包含模型预测结果的Polars DataFrame作为示例数据。
import polars as pl
df = pl.DataFrame({
"name": ["Alice", "Bob", "Caroline", "Dutch", "Emily", "Frank", "Gerald", "Henry", "Isabelle", "Jack"],
"truth": [1, 0, 1, 0, 1, 0, 0, 1, 1, 0],
"prediction": [1, 1, 1, 0, 0, 1, 0, 1, 1, 0],
"confidence": [0.343474, 0.298461, 0.420634, 0.125515, 0.772971, 0.646964, 0.833705, 0.837181, 0.790773, 0.144983]
}).with_columns(
(pl.col("truth") == pl.col("prediction")).alias("correct_prediction")
)
print("原始数据:")
print(df)原始数据:
shape: (10, 5) ┌──────────┬───────┬────────────┬────────────┬────────────────────┐ │ name ┆ truth ┆ prediction ┆ confidence ┆ correct_prediction │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ f64 ┆ bool │ ╞══════════╪═══════╪════════════╪════════════╪════════════════════╡ │ Alice ┆ 1 ┆ 1┆ 0.343474 ┆ true │ │ Bob ┆ 0 ┆ 1 ┆ 0.298461 ┆ false │ │ Caroline ┆ 1 ┆ 1 ┆ 0.420634 ┆ true │ │ Dutch ┆ 0 ┆ 0 ┆ 0.125515 ┆ true │ │ Emily ┆ 1 ┆ 0 ┆ 0.772971 ┆ false │ │ Frank ┆ 0 ┆ 1 ┆ 0.646964 ┆ false │ │ Gerald ┆ 0 ┆ 0 ┆ 0.833705 ┆ true │ │ Henry ┆ 1 ┆ 1 ┆ 0.837181 ┆ true │ │ Isabelle ┆ 1 ┆ 1 ┆ 0.790773 ┆ true │ │ Jack ┆ 0 ┆ 0 ┆ 0.144983 ┆ true │ └──────────┴───────┴────────────┴────────────┴────────────────────┘
我们的首要目标是将错误预测排在正确预测之前。我们可以利用correct_prediction列(布尔类型)作为第一个排序键。在Polars中,False(对应整数0)会排在True(对应整数1)之前。
# 定义第一个排序键:判断是否是正确预测
# False (0) 会排在 True (1) 之前,因此错误预测会优先出现
first_key = pl.col('truth').eq(pl.col('prediction'))
# 为了方便后续使用,我们可以将其赋值给一个变量
# good_pred = pl.col('truth').eq(pl.col('prediction'))这里我们直接在sort方法中使用表达式,并利用Python的赋值表达式:=将结果赋值给good_pred,以便在后续表达式中复用。
Musho
AI网页设计Figma插件
76
查看详情
在错误预测的组内,我们希望置信度最高的错误预测排在最前面。这意味着我们需要对置信度进行降序排序。对于正确预测的样本,这个排序键不应该影响它们的顺序,而是让下一个排序键来决定。
我们可以通过一个巧妙的数学表达式来实现这一点: (good_pred - 1) * pl.col('confidence')
对于正确预测的组内,我们希望置信度最低的预测排在最前面,即对置信度进行升序排序。由于第二个排序键对正确预测的样本都返回了0,因此它们将由第三个排序键来决定顺序。
# 定义第三个排序键:对置信度进行升序排序
# 这将应用于所有样本,但只有在前面键值相同的情况下才会生效
third_key = pl.col('confidence')将以上三个排序键组合到DataFrame.sort()方法中:
sorted_df = df.sort([
(good_pred:=pl.col('truth').eq(pl.col('prediction'))), # 1. 错误预测 (False/0) 优先于正确预测 (True/1)
(good_pred-1)*pl.col('confidence'), # 2. 错误预测内部,按置信度降序
pl.col('confidence') # 3. 正确预测内部,按置信度升序
])
print("\n条件排序后的数据:")
print(sorted_df)条件排序后的数据:
shape: (10, 5) ┌──────────┬───────┬────────────┬────────────┬────────────────────┐ │ name ┆ truth ┆ prediction ┆ confidence ┆ correct_prediction │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ f64 ┆ bool │ ╞══════════╪═══════╪════════════╪════════════╪════════════════════╡ │ Emily ┆ 1 ┆ 0 ┆ 0.772971 ┆ false │ │ Frank ┆ 0 ┆ 1 ┆ 0.646964 ┆ false │ │ Bob ┆ 0 ┆ 1 ┆ 0.298461 ┆ false │ │ Dutch ┆ 0 ┆ 0 ┆ 0.125515 ┆ true │ │ Jack ┆ 0 ┆ 0 ┆ 0.144983 ┆ true │ │ Alice ┆ 1 ┆ 1 ┆ 0.343474 ┆ true │ │ Caroline ┆ 1 ┆ 1 ┆ 0.420634 ┆ true │ │ Isabelle ┆ 1 ┆ 1 ┆ 0.790773 ┆ true │ │ Gerald ┆ 0 ┆ 0 ┆ 0.833705 ┆ true │ │ Henry ┆ 1 ┆ 1 ┆ 0.837181 ┆ true │ └──────────┴───────┴────────────┴────────────┴────────────────────┘
从输出结果可以看出,排序完全符合我们的预期:
以上就是Polars数据帧高级排序:利用布尔逻辑实现复杂条件排序的详细内容,更多请关注其它相关文章!
相关文章:
PHP表单提交后函数重复执行的解决方案:管理$_POST数据
微信网页版登录教程_微信网页版登录入口在哪
如何提高微信支付的安全性_微信支付安全防护与设置建议
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
2026春节假期时间安排 2026春节假日查询
12306几点到几点不能订票? | 官方最新系统维护时间全解析
高德地图公交到站提醒失败如何解决 高德提醒权限设置
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
J*a应用集成GitHub CLI与API认证指南
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
离线运行Go语言之旅:本地部署与GOPATH配置指南
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
steam官方网页快速访问 steam账号注册全流程
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
iwriter统一登录平台 iwrite账号密码登录页面
AO3最新入口2025公告_AO3中文官网合集
曝R星经典之作开发图 设计简陋但信息密集!
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
Lar*el Eloquent:基于关联关系是否存在进行父模型过滤与删除
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
AO3官方可用镜像 Archive of Our Own网页版最新入口
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
J*a ArrayList索引越界异常:动态构建列数据的高效策略
解决移动端滚动问题的overflow属性应用指南
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
QQ官网正版登录链接 QQ在线登录入口最新
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
J*a中实现Go语言select通道多路复用机制
Promise错误处理:在catch后终止链式then执行的策略
mysql备份恢复性能优化_mysql备份恢复性能优化方法
如何使用纯J*aScript判断Input元素是否在特定类容器内
怎么在mac上运行html代码_mac运行html代码方法【指南】
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
PDF文件体积过大处理_PDF压缩技巧详解
Python模块化编程:有效管理依赖与避免循环引用
Python Sounddevice 音频卡顿问题解析与队列数据安全处理
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升