Polars coalesce操作(取第一个非null值)(KIMI)

news/2025/9/18 20:07:03/文章来源:https://www.cnblogs.com/xiaoma2018/p/19099595

Polars coalesce操作(取第一个非null值)(KIMI)

本文为和KIMI的对话记录,仅供参考:


Polars join结合coalesce填充内容

User: 我有两个polars的dataframe,分别是df和df_task,两者都有id、text和labels字段,df的id应该包含df_task,我希望将df_task中的结果填写到df中,跳过df中labels字段已有的结果,id作为键

Kimi: 你可以使用 Polars 的 joincoalesce 来实现这个需求:

  • id 做键,把 df_task 中的 labels 合并到 df 中;
  • 如果 dflabels 已有值(非空),则保留原值,否则用 df_task 中的值填充。

✅ 示例代码如下:

import polars as pl# 假设 df 和 df_task 已经存在
# df: 目标 DataFrame
# df_task: 来源 DataFrame,包含更新值df_updated = (df.join(df_task.select("id", pl.col("labels").alias("labels_task")),on="id",how="left").with_columns(pl.coalesce("labels", "labels_task").alias("labels")).drop("labels_task")
)

🔍 说明:

  • join(..., how="left"):保留 df 的所有行;
  • pl.coalesce("labels", "labels_task"):如果 labels 非空就用它,否则用 labels_task
  • 最后清理掉中间列 labels_task

✅ 示例数据验证:

df = pl.DataFrame({"id": [1, 2, 3],"text": ["a", "b", "c"],"labels": ["X", None, "Z"]
})df_task = pl.DataFrame({"id": [1, 2, 3],"text": ["a", "b", "c"],"labels": ["A", "B", "C"]
})# 执行上面的代码后
# df_updated["labels"] 将是 ["X", "B", "Z"]

如果你有更多字段要合并,或者 labels 是列表/结构体类型,也可以扩展这个逻辑。需要我帮你处理更复杂的情况吗?

Join和coalesce类似的拼接和填充操作

User: 还有和join、coalesce类似的polars操作吗?

Kimi: 有,而且很多 —— Polars 把“SQL 里的常用套路”几乎都搬进来了。
下面把和 join / coalesce “功能类似、场景相近”的操作按用途分组列出来,一眼就能知道下次该用哪个。


  1. 横向拼接(join 家族)

名称 一句话区别 典型场景
join 通用等值连接 任何需要按 key 横向拼列的场景
inner / left / right / full / cross / semi / anti_join 缩写函数,语义与 SQL 完全一致 不想写 .join(..., how="xxx") 时直接用
asof_join (≥0.20 叫 join_asof) 最近邻、非精确匹配 按时间戳往前找“最新一条”行情、日志
join_where 任意表达式当 join key key 不是单列,而是复杂表达式

  1. 空值填充(coalesce 家族)

名称 一句话区别 用法示例
coalesce 返回第一个非空值 pl.coalesce("a", "b", "c")
fill_null 用固定值或策略填充 .fill_null("UNKNOWN") / .fill_null("forward")
fill_nan 仅针对 NaN 数值列里把 NaN 换成 0
forward_fill / backward_fill 向下/向上补值 时序缺值延续
interpolate 线性插值 数值列缺值平滑

  1. “更新/覆盖”语义(UPSERT 手感)

模式 核心函数 做法
有则更新,无则保留 join + coalesce 你刚才已经用过了
有则更新,无则新增 join + coalesce + concat 先拼出“新增行”,再 union
完全替换 join + select 把右表列重命名后直接覆盖左表列
按行去重 unique / distinct 更新完后去重

  1. 纵向拼接(union 家族)

名称 一句话区别
concat 把多个 df 纵向堆叠,支持 how="vertical"/"diagonal"
union SQL 语义,等价于 concat + unique

  1. 行号/索引类(做完 join 后常跟)

名称 用途
row_index 给 df 加一列连续行号(0.20+)
with_row_count 老版本同名函数

  1. 字段改名 / 选择性丢弃

名称 用途
rename 批量改列名
select / drop 只保留或丢掉指定列,做完 join 后清理中间列

  1. 窗口函数(join 完后做“同组内回填”)

名称 举例
over pl.col("labels").forward_fill().over("id")
rolling_* 滚动窗口均值、最大最小值

记忆口诀


“横向先 join,空值用 coalesce / fill,更新靠 select,纵向 concat,时序用 asof,同组 over。”

下次遇到“要把 B 表内容合进 A 表,但别动 A 表已有值”——
先想到 left-join + coalesce
如果 key 不是精确相等,就换成 join_asof
如果还要把 B 表的新行插进来,再 concat 一把即可。

Coalesce操作

User: coalesce这种操作有什么先例吗?为什么这么设计?

Kimi: coalesce 并不是 Polars 独创,它几乎原封不动地借用了 SQL 标准(ANSI SQL-92) 里早已存在 30 多年的同名函数,在关系型数据库(PostgreSQL、SQL Server、Oracle、MySQL、SQLite 等)、Spark、Pandas、Qlik 等系统里都能见到,行为完全一致:
“按书写顺序取第一个非 NULL 值,全 NULL 才返回 NULL”

一、先例时间线

  • 1970s
    System R(IBM 最早的 SQL 原型)就提供了 VALUE(),后来标准化为 COALESCE
  • 1992
    ANSI SQL-92 把 COALESCE 写进标准,所有主流数据库陆续实现。
  • 2000s
    商业 BI 工具(QlikView、OBIEE、Tableau)把 COALESCE 做成表达式,用于仪表盘计算。
  • 2010s
    Spark、Pandas 通过 coalesce/combine_first 引入 DataFrame 世界;Polars 2020 年直接复用 SQL 语义。

二、为什么这样设计

  1. 符合直觉的“降级”逻辑
    业务上常把“优先级列”依次排开:先用 A,A 缺失用 B,B 缺失用 C……顺序阅读即可,无需嵌套 IFNULL/NVL
  2. 与三值逻辑(TRUE/FALSE/NULL)自洽
    SQL 任何运算碰到 NULL 都传播 NULLCOALESCE 提供“短路”出口,让查询继续。
  3. 可变参数,一次扫描
    函数内部只需顺序判断,找到第一个非 NULL 立即返回,O(k) 时间、无需额外内存。
  4. 语法中性,跨平台无痛
    同一条 COALESCE(col1, col2, 0) 在 Oracle、PostgreSQL、Spark、Pandas、Polars 上结果相同,降低迁移成本。

三、小结

Polars 的 coalesce 并不是新发明,而是把 SQL 里经过 30 年考验的 NULL 处理套路 原样搬进 DataFrame 世界,既保持性能,又让熟悉 SQL 的人零学习成本。

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

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

相关文章

完整教程:液氮低温恒温器的应用领域

完整教程:液氮低温恒温器的应用领域pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

数字孪生能源大数据云平台建设方案 - 实践

数字孪生能源大数据云平台建设方案 - 实践2025-09-18 20:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

轮转数组-leetcode

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: …

CF1864G Magic Square

题面:(粘自洛谷) CF1864G Magic Square 题目描述 Aquamoon 有一个魔方,可以看作一个 \(n \times n\) 矩阵,矩阵的元素构成数字的排列 $1, \ldots, n^2 $ 。 Aquamoon 可以对矩阵执行两种操作:行移位,即将矩阵的整…

endsWith() 字符串部子串判断函数

endsWith() 字符串部子串判断函数前言endsWith()是Jmeter Java脚本组件中一个很好用的判断字符串尾串的函数。但,就是这么简单的函数,还是没能避免 一看就会,一练就废的陷阱。 踩坑之 一看就会,一练就废的endsWith…

OI TRICKS

位运算 每一位是独立的,可以拆开处理 \(a, b \in \{0, 1\}\),则xor and or\(a \oplus 1 = 1- a\) \(a \ \text{and} \ 0 = 0\) \(a \ \text{or} \ 1 = 1\)\(a \oplus 0 = a\) \(a \ \text{and} \ 1 = a\) \(a \ \…

深入解析:Okular开源免费的跨平台文档查看神器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

day37大模型程序开发-GraphRAG理论

RAG基本回顾实现流程准备原始的知识库(一个一个的文件组成) 将知识库文件内容进行读取(完整的字符串) 分块处理(新知识库:一段一段的文本字符串组成) 向量转换:将每一段文本chunk转换成向量(向量模型) 将向量…

AI Compass前沿速览:Nano Bananary、MCP Registry、通义DeepResearch 、VoxCPM、InternVLAM1具身机器人

AI Compass前沿速览:Nano Bananary、MCP Registry、通义DeepResearch 、VoxCPM、InternVLAM1具身机器人AI Compass前沿速览: AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态,通过六大核心模块…

day3536大模型应用开发-模型微调框架

为什么需要微调? 在开始学习微调之前,大家首先还是要搞清楚为什么要微调?在什么情况下需要微调?让模型更懂“专业话”:通用模型就像一个“万事通”,它学过很多东西,但对一些特别专业的领域(比如医学、法律、金…

day12-Trae之一键换脸APP开发02

今日内容 1 Trae配置 # 1 之前就装过python解释器和JDK了 # 2 如果你电脑上没有任何编辑器,使用txt写代码,都可以可以运行pyton或java的项目# 3 IDE只是个快速写代码的软件,如果没装python解释器和JDK---》代码运行…

day35大模型应用开发-模型微调

为什么需要微调? 在开始学习微调之前,大家首先还是要搞清楚为什么要微调?在什么情况下需要微调?让模型更懂“专业话”:通用模型就像一个“万事通”,它学过很多东西,但对一些特别专业的领域(比如医学、法律、金…

Rust多线程:Worker 结构体与线程池中任务的传递机制

本文分享自天翼云开发者社区《Rust多线程:Worker 结构体与线程池中任务的传递机制》,作者:l****n Rust多线程:Worker 结构体与线程池中任务的传递机制 **在实现一个多线程的 Web 服务器时,我们会遇到一个问题:如…

day10-AI短视频01

今日内容 1 AI 短视频介绍 1.1 AI短视频是什么 # 1 AI 短视频是指通过人工智能技术(尤其是生成式 AI、智能剪辑算法等)自动或辅助完成制作的短视频内容,其核心是利用 AI 工具替代或简化传统短视频创作中 “内容生成…

详细介绍:今日分享 KMP算法

详细介绍:今日分享 KMP算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

【每日算法】两数相加 LeetCode - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

04-简单查询

04-简单查询$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");查询单个字段 案例1:查询公司中所有员工编号案例2:查询公司中所有员工姓名查多个字段 案例1:…

MSS 到底是什么?Wireshark 分析TCP过程 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

线性回归与 Softmax 回归核心内容总结 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

P6631 [ZJOI2020] 序列 题解

很好的贪心题。 考虑从左到右枚举每个位置,每次在右边添加一个数时更行答案。 容易想到记录当前前缀可以继续向右延伸的 \(1,2,3\) 操作的个数。记当前需要添加的数为 \(i\),用 \(c,x,y\) 分别表示可以继续向右延伸(…