尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Polars 缺失数据处理实战指南:从 null 检测、策略填充到 NaN 与 inf 清洗
示例工程教程【免费下载链接】materialsBonus materials, exercises, and example projects for our Python tutorials项目地址https://gitcode.com/gh_mirrors/ma/materials点击查看免费下载导读本文以materials仓库中 polars-missing-data 目录的教程配套资源为主体系统讲解 Polars 中缺失数据null、NaN、inf的检测、删除、填充与插补全流程。读者将掌握null_count()、is_null()、drop_nulls()、fill_null()、all_horizontal()、cs类型选择器以及replace()清洗非有限数值的完整实战方案并可通过仓库自带的tips、sales_trends、ft_exercise三个真实数据集动手验证每一种策略。一、配套资源一览一次安装随教程同步练习polars-missing-data/README.md 对目录内容做了清晰说明本目录中的全部文件专为「How to Deal With Missing Data in Polars」教程配套设计便于读者边看边练文件说明tutorial_code.ipynb教程中出现的全部代码本文所有示例均出自该 Notebook 的 26 个单元格tips.parquet小费数据 Parquet 文件覆盖 null 检测与多策略填充演示sales_trends.csv销售趋势 CSV 文件专门演示 NaN 与 ±inf 的清洗ft_exercise.parquet综合练习数据英剧《弗尔蒂旅馆》剧集信息用于巩固所学ft_exercise_solution.csv综合练习的参考答案三个数据集的真实结构已通过读取仓库文件验证如下tips.parquet180 行、7 列record_id、total、tip、gender、smoker、day、time其中total有 2 个缺失值、tip有 4 个缺失值、time有 2 个缺失值其余列无缺失——数据规模适中非常适合在本地快速复现全部示例。sales_trends.csv5 行、4 列product、last_year、current_year、next_year其中next_year一列同时包含NaN、空字符串、inf与-inf是清洗非有限值的理想样本。ft_exercise.parquet12 行、4 列episode、series、title、original_dateseries有 2 个缺失、title有 2 个缺失、original_date有 1 个缺失用于演练forward/backward填充与线性插值。环境准备教程代码统一通过 Polars 的**惰性 APILazyFrame**编写——pl.scan_parquet()、pl.scan_csv()返回 LazyFrame操作链最后用.collect()触发实际计算。这既保证了大数据集上的性能也让每一步变换都可读、可调试。运行前先安装依赖!python -m pip install polars随后导入 Polars 并加载小费数据import polars as pl tips pl.scan_parquet(tips.parquet) tips.collect()二、定位缺失数据从全局盘点开始处理缺失数据的第一步永远是「知道缺在哪里、缺了多少」。Polars 提供两个最基础的定位手段。1. 全局盘点null_count()对整个 LazyFrame 调用null_count()返回一个按列统计缺失值数量的新 DataFrame(tips.null_count()).collect()在tips数据上输出会明确告诉你record_id、gender、smoker、day四列完整无损而total、tip、time三列存在缺失。这份盘点清单决定了后续策略的优先级。2. 精确筛选is_null()与filter()pl.col(...).is_null()对单列做布尔掩码配合filter()即可精准提取「某几列同时缺失」的行import polars as pl tips pl.scan_parquet(tips.parquet) (tips.filter(pl.col(total).is_null() pl.col(tip).is_null())).collect()这条语句返回的是total与tip同时为 null的行。在实际数据中这样的行是存在的——同一笔账单既没有消费总额也没有小费说明该条记录整体不可信应当优先处理。与之相对只有单列缺失的行则往往可以通过填充策略挽救。三、基础应对删除与填充拿到缺失值分布后最直接的两种处置方式就是「删」与「填」。1. 删除缺失行drop_nulls()drop_nulls()在未指定参数时删除任意列含缺失的行若指定列名则只删除该列缺失的行( tips.drop_nulls(pl.col(total)).filter( pl.col(total).is_null() pl.col(tip).is_null() ) ).collect()先按total列删掉缺失行再筛「双缺失」记录时结果为空——证明这类「账单级缺漏」已被整体清除。drop_nulls()的列参数既支持pl.col(total)表达式写法也支持直接传字符串total后文会看到两种写法并存。2. 填充缺失值fill_null()删除会损失数据如果缺失列本身信息量仍可挽救更稳妥的做法是填充。最朴素的方式是填充常量( tips.drop_nulls(pl.col(total)) .with_columns(pl.col(tip).fill_null(0)) .filter(pl.col(tip).is_null()) ).collect()这条链路展示了 Polars 的链式变换风格先删掉total缺失的行再用with_columns()将tip列的 null 填充为0最后过滤验证——此时tip已无任何 null符合预期。用0填充小费在业务上可解释为「未记录小费即视为未支付小费」是缺失数值列最常见的兜底方案。四、更战略化的思路按列差异化处理教程强调缺失值处理不应一刀切而要「战略化」地逐列分析先看每列缺失值的业务含义再分别选用删除、常量填充或策略填充。1. 单列定位time列的缺失import polars as pl tips pl.scan_parquet(tips.parquet) (tips.filter(pl.col(time).is_null())).collect()筛选出time就餐时段取值为Lunch/Dinner为 null 的行。这是一个枚举型分类列显然不能用0填充——语义上讲不通必须用邻近记录的值来补。2. 观察上下文用is_in()精准抽查为了看清缺失行周围的数据规律教程用is_in()按主键批量抽取目标记录(tips.filter(pl.col(record_id).is_in([2, 3, 4, 14, 15, 16]))).collect()对照抽查结果可以发现record_id为 3 和 15 的行time缺失而它们前后的记录如 2、14、16都有明确的就餐时段。这提示我们——用相邻记录的值进行前向填充是合理的。3. 组合策略删除 常量填充 前向填充( tips.drop_nulls(total) .with_columns(pl.col(tip).fill_null(0)) .with_columns(pl.col(time).fill_null(strategyforward)) .filter(pl.col(record_id).is_in([3, 15])) ).collect()这是一条典型的多策略流水线三种手段各司其职drop_nulls(total)删除账单总额缺失的不可信记录注意这里用的是字符串参数写法pl.col(tip).fill_null(0)数值列小费统一填0pl.col(time).fill_null(strategyforward)分类列time采用前向填充forward fill用上一个非缺失值补齐后续缺失。fill_null(strategyforward)是 Polars 内置的策略化填充forward用上方最近的非空值填充backward则用下方最近的非空值填充。对于「时段」这类随时间推进、上下记录强相关的列前向填充远比常量填充贴合真实业务。五、跨多列协同all_horizontal()的妙用前文的is_null() is_null()写法在列数多时会变得冗长。Polars 提供了水平聚合函数all_horizontal()可把多列的布尔判断打包成一条import polars as pl tips pl.scan_parquet(tips.parquet) (tips.filter(pl.all_horizontal(pl.col(total, tip).is_null()))).collect()pl.col(total, tip)一次选中两列并逐列调用is_null()all_horizontal()要求所有指定列的判断同时为真才保留该行等价于total与tip同时缺失的行——与第二节写法的结果完全一致但可读性和扩展性更好。反向需求同样简单取非即可得到「至少一列不缺失」的行tips pl.scan_parquet(tips.parquet) (tips.filter(~pl.all_horizontal(pl.col(total, tip).is_null()))).collect()把逻辑稍作延伸就可以在过滤掉「双缺失」记录后对剩余行做差异化填充并再次全局盘点import polars as pl tips pl.scan_parquet(tips.parquet) ( tips.filter(~pl.all_horizontal(pl.col(total, tip).is_null())) .with_columns(pl.col(tip).fill_null(0)) .with_columns(pl.col(time).fill_null(strategyforward)) ).null_count().collect()这条链路先剔除不可信记录再分别对数值列、分类列执行不同填充策略最后用null_count()收尾验证。这种「过滤 → 分列填充 → 复核」的模式正是实战中处理多列缺失的标准套路。六、按数据类型批量填充cs选择器当 DataFrame 列数众多时逐列指定填充值不现实。Polars 的selectors模块惯例导入为cs支持按数据类型批量选取列让填充逻辑按类型统一生效。教程用一组科学家数据演示import polars as pl scientists pl.LazyFrame( { scientist_id: [1, 2, 3, 4, 5], first_name: [Isaac, Louis, None, Charles, Marie], last_name: [None, Pasteur, Einstein, Darwin, Curie], birth_year: [1642, 1822, None, 1809, 1867], death_year: [1726, 1895, 1955, None, 1934], } ) scientists.collect()数据中姓名字符串列有None出生/死亡年份整型列也有None。此时按类型批量填充极为高效import polars.selectors as cs ( scientists.with_columns(cs.string().fill_null(Unknown)).with_columns( cs.integer().fill_null(0) ) ).collect()两条with_columns()分别完成两件事cs.string().fill_null(Unknown)选中所有字符串列first_name、last_name缺失值统一填充为Unknowncs.integer().fill_null(0)选中所有整数列birth_year、death_year缺失值统一填充为0。cs.string()、cs.integer()这类类型选择器与pl.col的按名选择形成互补列名不确定或列数极多时按类型选择能显著减少代码量同时保证填充策略与列语义天然匹配。七、清理 NaN 与 ±inf非有限数值的专项处理前文处理的 null 是「缺失」的语义而sales_trends.csv揭示了一个更隐蔽的陷阱NaN、inf、-inf属于 IEEE 754 浮点数的合法取值却不是缺失值——它们不会被is_null()捕获却会污染均值、方差等一切统计计算。import polars as pl sales_trends pl.scan_csv(sales_trends.csv) sales_trends.collect()从仓库中的 sales_trends.csv 可以看到next_year列同时存在NaN、空值、inf与-inf四种异常形态C行甚至直接是空字符串读取时被推断为空product,last_year,current_year,next_year A,17,19,29.0 B,35,35,NaN C,21,19, D,42,50,-inf E,23,25,inf1. 统一归一为 nullreplace()教程的第一步是把所有非有限值显式替换为None使其进入 null 处理体系( sales_trends.with_columns( pl.col(next_year).replace( [float(inf), -float(inf), float(NaN)], None ) ) ).collect()replace([旧值列表], 新值)一次性把inf、-inf、NaN三种特殊浮点值全部映射为None。归一之后后续所有fill_null()、drop_nulls()、null_count()等缺失值工具即可统一接管。2. 业务化插补基于相邻年份的线性推算对next_year这类趋势列教程示范了比常量填充更有说服力的插补思路——利用前后年份差值外推( sales_trends.with_columns( pl.col(next_year).replace( [float(inf), -float(inf), float(NaN)], None ) ).with_columns( pl.col(next_year).fill_null( pl.col(current_year) (pl.col(current_year) - pl.col(last_year)) ) ) ).collect()fill_null()的实参不仅可以传常量也可以传表达式这里用「当前年份 当前年份 − 上年份」估算缺失的下一年的销量即假设销量保持上年同期的增量。这是fill_null最灵活的用法之一——填充值由其他列动态计算得出而非拍脑袋定死的常数。八、综合实战结合when的混合填充与线性插值教程在最后安排了一道综合练习数据为英剧《弗尔蒂旅馆》Fawlty Towers的剧集信息。先加载并盘点缺失import polars as pl episodes pl.scan_parquet(ft_exercise.parquet) episodes.null_count().collect()从仓库数据ft_exercise.parquet可知series缺失 2 个、title缺失 2 个、original_date缺失 1 个episode无缺失。参考答案ft_exercise_solution.csv给出了修复后的完整 12 行数据可用于核对你的处理结果。难点在于同一列的填充策略需要随剧集号变化——前向、后向、常量三种手段要按行分支。Polars 的when/then/otherwise表达式正是为此设计import polars as pl episodes pl.scan_parquet(ft_exercise.parquet) ( episodes.with_columns( pl.when(pl.col(episode) 6) .then(pl.col(series).fill_null(strategyforward)) .otherwise(pl.col(series).fill_null(strategybackward)) ) .with_columns( pl.when(pl.col(episode) 4) .then(pl.col(title).fill_null(The Hotel Inspectors)) .otherwise(pl.col(title).fill_null(Waldorf Salad)) ) .with_columns(pl.col(original_date).interpolate()) ).null_count().collect()逐层拆解这段答案series列按剧集号分支episode 6的行使用前向填充该行属于第一季末尾上方存在同季记录其余行使用后向填充第二季开头的缺失需从下方补齐两种策略在同一列内通过when/then/otherwise共存title列按剧集号分支episode 4的行填The Hotel Inspectors与参考答案 ft_exercise_solution.csv 第 5 行一致其余缺失填Waldorf Salad对应第 9 行的真实标题——说明这里的常量并非随意选择而是基于已知剧集真实标题的业务填充original_date列用interpolate()这是 Polars 的线性插值方法按行号等距推算缺失日期比前后向填充更平滑最后再次调用null_count()全表各列均为 0验证修复完成。九、小结缺失数据处理决策清单结合教程代码与仓库数据可以沉淀出一套可复用的处理决策流程场景推荐手段仓库示例先摸清缺失规模null_count()tips数据盘点定位特定缺失行filter(pl.col(...).is_null())time列缺失抽查整行不可信drop_nulls(列名)删除total缺失的账单数值列兜底fill_null(0)tip填充为 0时序/枚举列fill_null(strategyforward/backward)time前向填充、series分支填充多列协同筛选pl.all_horizontal(...)双缺失记录过滤按类型批量填充cs.string()/cs.integer()科学家数据修复NaN / ±inf 清洗replace([inf, -inf, NaN], None)sales_trends清洗动态推算填充fill_null(表达式)next_year增量外推平滑插值interpolate()original_date补全按行分支策略pl.when(...).then(...).otherwise(...)ft_exercise综合练习实践中可以遵循「先盘点null_count→ 再定位is_nullfilter→ 分列决策删/填/插值→ 最后复核再次null_count」的四步闭环。本目录的 tutorial_code.ipynb 是上述全部代码的完整可运行集合配合tips、sales_trends、ft_exercise三个数据集即可在本地完整复现从基础检测到高级插补的每一环节。赞分享示例工程教程【免费下载链接】materialsBonus materials, exercises, and example projects for our Python tutorials项目地址https://gitcode.com/gh_mirrors/ma/materials点击查看免费下载相关推荐Polars缺失值处理多种填充策略与空值检测方法Polars缺失值处理多种填充策略与空值检测方法 引言数据清洗中的隐形陷阱 你是否曾因缺失值Missing Value / 空值Null导致模型训练失数据分析大数据5个高效策略Meridian营销组合建模中的数据清洗与缺失值处理完全指南5个高效策略Meridian营销组合建模中的数据清洗与缺失值处理完全指南 Meridian作为谷歌开发的 营销组合建模 MMM 框架 为广告主提供了强大的内告别数据漏洞pandas缺失值处理全攻略从检测到填充的完美实践告别数据漏洞pandas缺失值处理全攻略从检测到填充的完美实践 在数据处理过程中,缺失值就像隐藏的数据漏洞,悄无声息地影响着分析结果的准确性。一项针对Kagg数据分析数据科学数据处理上一篇Lago容器健康检查频率配置适当的组件健康检查间隔下一篇三步构建跨平台音乐聚合系统智能音源配置完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

OptiSystem环形通量仿真技术详解与应用实践

OptiSystem环形通量仿真技术详解与应用实践

1. 环形通量仿真技术背景解析在光纤通信系统设计与性能评估中,环形通量(Radial Flux)是一个关键的光场分布参数指标。它直接反映了光信号在纤芯中的能量分布特性,对模式耦合、非线性效应和传输损耗等性能指标有着决定性影响。传统…

📅 2026/10/15 2:07:45
基于ASP.NET的志愿者服务平台asp.net管理系统

基于ASP.NET的志愿者服务平台asp.net管理系统

✅源码获取: 🍅-------------------【点击左侧最上方的头像,置顶文章最上方wx】联系我们-----------------🍅✌网站介绍:✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。✌服务范围:大数据、机…

📅 2026/10/15 2:07:45
让用户看到本地语言的宝可梦:PokeAPI 多语言数据怎么用

让用户看到本地语言的宝可梦:PokeAPI 多语言数据怎么用

让用户看到本地语言的宝可梦:PokeAPI 多语言数据怎么用 【免费下载链接】pokeapi The Pokmon API 项目地址: https://gitcode.com/GitHub_Trending/po/pokeapi PokeAPI(pokeapi.co 背后的开源项目)是一套 Pokmon RESTful API 服务端&a…

📅 2026/10/15 2:02:44
MORE NEWS

更多资讯

📰

Qt自适应控件:基于BDU的跨DPI/缩放响应式UI方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

2026论文爆款降AIGC平台大曝光:一键改写直达人工原创!

降AI率的核心技术也在这场博弈中完成了进化。到了2026年,那些只会机械替换同义词的劣质软件早就被淘汰,顶级的降AIGC大模型已经迈入了深度语义重构的新纪元。真正硬核的降AI平台,不仅能顺手把重复率降下来,更牛的是它们能像X光一样…

📰

BiliTools 快速上手:免费 B 站视频下载、弹幕存档与媒体库整理

BiliTools 快速上手:免费 B 站视频下载、弹幕存档与媒体库整理 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools 是一款免费开源的 B 站工具箱,在 Windows、macOS 和 Li…

📰

Qt状态机与状态模式:工业UI状态管理实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

[技术讨论] 了解一下EtherCAT模块的竞品设计,想不到也是蛮有意思的事情

之前给客户开发一款定制的EtherCAT模块的时候,客户寄给我们一套相应的另一供应商设计的产品,对于我们而言,称之为竞品,然后好像就是因为这个竞品模块在客户现场时不时就出现EtherCAT网络断开的异常,才找我们来开发和设…

📰

Linux软件安装 —— zookeeper集群安装

文章目录一、节点说明二、下载软件三、安装JDK四、安装zookeeper五、zookeeper基本命令一、节点说明 IP主机名192.168.10.102node02192.168.10.103node03192.168.10.104node04二、下载软件 官网地址:Apache ZooKeeper 本文安装版本为:apache-zookeepe…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬