利用Pandas和NumPy高效筛选NaN附近有效数据的教程

利用Pandas和NumPy高效筛选NaN附近有效数据的教程

本教程探讨了在python中,如何高效地处理包含nan的数值数据,并为每个nan值智能地提取其前后指定数量的有效数值。文章将详细介绍如何结合使用pandas的ffill、numpy的sliding_window_view以及数据帧的join操作,以优雅且高效的方式实现这一复杂的数据筛选和选择逻辑,尤其适用于需要处理不规则数据缺失场景下的数据预处理任务。

在数据分析和预处理过程中,我们经常会遇到包含缺失值(NaN)的数值型数据。一个常见的需求是,当某个数据点为NaN时,我们需要从其周围提取固定数量的“有效”(非NaN)数值。这个任务的复杂性在于,有效数值可能不均匀分布在NaN点的前后,且提取过程中可能遇到其他的NaN值,需要灵活处理。传统的循环遍历方法效率低下,难以应对大规模数据集。本教程将介绍一种结合Pandas和NumPy的“巧妙”方法,以实现高效且灵活的NaN邻近有效数据筛选。

核心概念与工具

本解决方案主要依赖以下Pandas和NumPy的关键功能:

pandas.Series.ffill() (Forward Fill):向前填充缺失值。在此方案中,它被巧妙地用于将最近的有效数据点的索引向前传播,为后续的滑动窗口操作提供对齐依据。numpy.lib.stride_tricks.sliding_window_view():创建一个滑动窗口视图。它可以在不复制数据的情况下,高效地生成数组的滑动窗口视图,这对于提取连续的子序列非常有用。关键在于,我们将此操作应用于已过滤掉NaN的有效数据序列。pandas.DataFrame.join():根据索引合并两个DataFrame。我们将利用它将原始数据与通过滑动窗口生成的邻近有效数据合并。

实现步骤详解

假设我们有一个包含NaN值的Pandas DataFrame,目标是为每个NaN值提取其前B个和后A个有效数值。

1. 准备示例数据

首先,我们创建一个示例DataFrame,其中包含一些NaN值,以便演示。

import pandas as pdimport numpy as npfrom numpy.lib.stride_tricks import sliding_window_view as swv# 示例数据data = {    'col': [np.nan, 0.0, 1.0, 2.0, np.nan, np.nan, 3.0, 4.0, 5.0, np.nan, 6.0, np.nan, 7.0, 8.0, 9.0, np.nan, 10.0]}df = pd.DataFrame(data)print("原始数据:")print(df)

2. 定义提取参数并识别有效数据

我们定义需要提取的有效数值数量:B 为NaN之前的数量,A 为NaN之后的数量。然后,从DataFrame中提取目标列,并创建一个布尔掩码来识别非NaN值。

B = 2  # NaN前需要提取的有效数值数量A = 3  # NaN后需要提取的有效数值数量# 提取目标列为Series,并确保索引是范围索引s = df['col'].reset_index(drop=True)# 识别非NaN行m = s.notna()

3. 巧妙利用ffill对齐索引

这是解决方案中的一个关键步骤。我们首先将Series的索引转换为Series,然后使用where(m)将NaN值对应的索引替换为NaN,接着使用ffill()将这些NaN索引填充为它们前面最近的有效数值的原始索引。这个idx Series将成为我们后续对齐滑动窗口结果的桥梁。

# 掩盖NaN的索引,并用ffill向前填充,将NaN位置与最近的有效数值索引关联起来idx = s.index.to_series().where(m).ffill()

现在,idx Series中的每个元素(除了开头连续的NaN)都指向其自身或其前面最近的有效数值的原始索引。

4. 应用滑动窗口视图生成邻近数据

我们将sliding_window_view应用于只包含有效数值的Series (s[m])。这会生成一个多维数组,其中每一行都是一个滑动窗口。

# 在有效数值上应用滑动窗口视图# A+B 是窗口大小# 窗口的索引需要特殊处理,以与ffill后的idx对齐tmp = pd.DataFrame(swv(s[m], A + B),                    index=idx[m].shift(-B + 1)[:m.sum() - (A + B) + 1])

swv(s[m], A + B):在过滤掉NaN的Series s[m] 上创建大小为 A+B 的滑动窗口。index=idx[m].shift(-B + 1)[:m.sum() – (A + B) + 1]:这一步非常精巧。idx[m]:获取有效数值对应的 idx 值。.shift(-B + 1):将这些索引向后移动 B-1 个位置。这是为了将滑动窗口的起始点(即窗口中的第 B 个元素)与我们希望关联的NaN位置的 idx 值对齐。[:m.sum() – (A + B) + 1]:截取索引,使其长度与滑动窗口视图 swv(s[m], A + B) 生成的行数匹配。

5. 重构与合并结果

最后,我们将滑动窗口结果tmp重新索引到idx Series,然后将其索引设置为原始DataFrame的索引,并使用mask(m)操作来清除原始数据中非NaN行对应的邻近数据(因为我们只关心NaN位置的邻近数据),最终通过join操作合并回原始DataFrame。

# 重新索引tmp到ffill后的idx,设置回原始df的索引,并掩盖掉原始数据非NaN行对应的结果# 这样只有原始数据中为NaN的行,其新列才会有值out = df.join(tmp.reindex(idx).set_axis(df.index).mask(m))print("n处理结果:")print(out)

结果分析

运行上述代码,您将得到一个扩展的DataFrame:

原始数据:     col0    NaN1    0.02    1.03    2.04    NaN5    NaN6    3.07    4.08    5.09    NaN10   6.011   NaN12   7.013   8.014   9.015   NaN16  10.0处理结果:     col    0    1    2    3    40    NaN  NaN  NaN  NaN  NaN  NaN1    0.0  NaN  NaN  NaN  NaN  NaN2    1.0  NaN  NaN  NaN  NaN  NaN3    2.0  NaN  NaN  NaN  NaN  NaN4    NaN  1.0  2.0  3.0  4.0  5.05    NaN  1.0  2.0  3.0  4.0  5.06    3.0  NaN  NaN  NaN  NaN  NaN7    4.0  NaN  NaN  NaN  NaN  NaN8    5.0  NaN  NaN  NaN  NaN  NaN9    NaN  4.0  5.0  6.0  7.0  8.010   6.0  NaN  NaN  NaN  NaN  NaN11   NaN  5.0  6.0  7.0  8.0  9.012   7.0  NaN  NaN  NaN  NaN  NaN13   8.0  NaN  NaN  NaN  NaN  NaN14   9.0  NaN  NaN  NaN  NaN  NaN15   NaN  NaN  NaN  NaN  NaN  NaN16  10.0  NaN  NaN  NaN  NaN  NaN

观察输出结果:

原始数据列 col 保持不变。新增了以 0, 1, 2, 3, 4 为列名的新列。这些列代表了每个NaN位置(如果存在)提取到的 B+A 个有效邻近值。对于原始数据中为NaN的行(例如索引4、5、9、11),新的列中会显示其对应的有效邻近值。例如,索引4和5的NaN,其前面两个有效值是1.0, 2.0,后面三个有效值是3.0, 4.0, 5.0,所以新列显示 1.0, 2.0, 3.0, 4.0, 5.0。对于原始数据中非NaN的行,新增的列则为NaN,因为我们只关心填充NaN位置。对于末尾的NaN(索引15),由于其后没有足够的有效值,因此新的列也显示为NaN。这表明该方法能够自动处理边界条件。

注意事项与优化

参数 B 和 A 的含义: B 代表NaN“之前”所需的有效数值数量,A 代表NaN“之后”所需的有效数值数量。它们决定了滑动窗口的大小和提取的范围。性能: 此方法充分利用了NumPy的矢量化操作和 sliding_window_view 的视图特性(不复制数据),以及Pandas的优化内部实现,因此在大数据集上表现出优异的性能,远超基于Python循环的实现。灵活性: 通过简单地调整 B 和 A 的值,可以轻松改变提取邻近数据的策略。理解复杂性: 尽管代码相对简洁,但理解 idx 的生成逻辑、sliding_window_view 的索引对齐以及 mask(m) 的作用是掌握此方法的关键。它巧妙地将原始索引、有效数据索引和滑动窗口结果关联起来。边界条件处理: 当NaN位于数据序列的开头或结尾,或者其周围没有足够的有效数值时,sliding_window_view 的结果会相应减少,并且最终的 join 操作会正确地填充NaN,表示无法获取足够的邻近数据。

总结

本教程介绍了一种在Python中利用Pandas和NumPy高效处理NaN值并提取其邻近有效数据的专业方法。通过结合 pandas.Series.ffill()、numpy.lib.stride_tricks.sliding_window_view() 和 pandas.DataFrame.join(),我们能够以一种矢量化、高性能的方式解决这一常见的数据预处理挑战。这种方法不仅代码简洁,而且能够优雅地处理各种复杂的边界条件和NaN分布情况,是数据科学家和工程师在处理不规则缺失数据时的有力工具。

以上就是利用Pandas和NumPy高效筛选NaN附近有效数据的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1379021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何对多层索引DataFrame应用不同规则进行分组聚合
上一篇 2025年12月14日 20:18:07
Odoo产品变体界面添加产品模板字段搜索功能指南
下一篇 2025年12月14日 20:18:20

相关推荐

  • 探探修改定位怎么实现_探探虚拟定位异地交友教程

    可通过虚拟定位实现探探异地交友。①使用“Fake GPS Location”等App修改iPhone定位;②用雷电模拟器在电脑运行探探并篡改GPS;③技术用户可重签名IPA注入定位模块,持久化伪装位置。 如果您希望在探探上实现异地交友,但受限于当前地理位置无法匹配到目标城市用户,则可以通过修改定位来…

    2026年9月3日
    000
  • HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长

    HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长

    6月19日,hdc2025分论坛期间,鲸鸿动能举办了品牌增长主题沙龙。来自多个行业的资深人士,包括知名品牌代表、创意先锋及技术企业负责人齐聚一堂,围绕“确定性增长”这一核心议题,展开深入交流,共同探索如何重掌营销主动权。 在当前多变的市场环境中,“营销失权”成为众多品牌面临的难题。企业常常陷入被动应…

    2026年9月3日 用户投稿
    000
  • win8系统文件复制进度卡住_win8数据传输中断的解决方案

    win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案

    win8文件复制卡住或传输中断的解决方法包括:1.检查磁盘空间是否足够,腾出空间后重试;2.检测磁盘健康状况,使用工具修复坏道;3.运行chkdsk命令修复文件系统错误;4.更新驱动或更换usb接口以解决兼容性问题;5.排查文件本身是否损坏;6.关闭杀毒软件避免干扰;7.检查网络连接及权限设置;8.…

    2026年9月3日 用户投稿
    200
  • 解决文件上传和字符串处理的困境:moxuandi/yii2-helpers 库的实践应用

    composer在线学习地址:学习地址 在项目开发过程中,文件上传和字符串处理是两个常见的需求,但它们也常常会带来一些挑战。例如,如何高效地处理不同格式的图片上传,如何格式化文件大小,或者如何获取图片的属性等。这些问题在没有合适工具的情况下,可能会导致代码冗长且难以维护。 幸运的是,moxuandi…

    用户投稿 2026年9月3日
    000
  • win11怎么使用性能监视器_Win11性能监视器使用详解

    首先打开性能监视器(perfmon)生成系统性能报告,再通过任务管理器查看实时资源占用,并可启用游戏栏叠加层监控CPU、内存、GPU等指标。 如果您需要对Windows 11系统的运行状况进行深度分析,以排查性能瓶颈或资源占用异常问题,可以利用系统内置的性能监视器工具获取详尽的数据报告。以下是具体的…

    2026年9月3日
    000
  • Safari网页版入口 Safari直接打开

    Safari网页版可通过官网https://www.apple.com/safari/直接访问,支持跨平台浏览,页面加载快且适配多语言;具备节能、防跟踪、支持现代网页标准等技术优势,并与Apple生态无缝集成,提供简洁界面、阅读器模式和手势导航等优质用户体验。 Safari网页版入口 Safari直…

    2026年9月3日
    000
  • 掌握HTML、CSS、JS、PHP、MySQL等技能,毕业生的求职前景如何?

    掌握HTML、CSS、JS、XAMPP、PHP和MySQL技能的毕业生,就业前景如何?这是一个许多即将毕业的大学生都关心的问题。 这位同学能够使用这些技能构建前后端网站,却对未来就业感到迷茫,只学习过一些Vue基础知识。 能否找到工作,并非简单的“是”或“否”。 这取决于多个因素:招聘岗位需求、作品…

    2026年9月3日
    100
  • 使用 Composer 解决 PHP 代码风格问题:Classy-org/php-classy-standards 库的实践

    可以通过以下地址学习 composer:学习地址 在开发 PHP 项目时,保持代码风格的一致性是一个挑战。团队中的每个开发者都有自己的编码习惯,这导致了代码库中的风格杂乱无章,影响了项目的整体质量和维护效率。我尝试了手动修改代码、使用 IDE 插件等方法,但这些方法都无法有效地解决问题。 在不断探索…

    用户投稿 2026年9月3日
    100
  • ​​Excel表格卡顿?优化大文件运行速度​​

    首先判断卡顿原因是文件问题还是电脑配置问题,1.通过打开其他大文件测试是否卡顿以确定问题来源;2.观察cpu、内存和硬盘使用情况,若占用高则可能是公式计算量大或数据量超载;3.优化公式结构,使用高效函数如sumifs替代复杂嵌套;4.减少易失性函数如now()、today()的使用,改用静态值;5.…

    2026年9月3日
    500
  • 如何为iPhoneXS获取最新固件?快速下载与验证方法

    首先确认iPhone XS型号并检查官方更新,再通过iTunes或Finder验证固件,最后从可信网站如ipsw.me下载并核对IPSW文件的签名状态与校验值。 如果您尝试为您的iPhone XS升级系统,但官方渠道未提供最新版本选项,或您希望提前获取固件文件进行验证与准备,则可能需要通过手动方式下…

    2026年9月3日
    200
  • 秋季焕新如何不踩坑?三翼鸟全新上线“4个1”省心服务

    秋意正浓,正是家装焕新的黄金时节。许多人希望趁着气候舒适,为居所注入新气象。然而,一提到装修过程中要反复奔波、沟通繁琐,还要应对设计风格混乱、工期拖延、售后难寻等问题,不少人便望而却步——难道打造一个理想的家,真的必须经历这般折腾吗? 自10月1日起,三翼鸟正式启动秋季家装季活动,带来全新解法。聚焦…

    2026年9月3日
    100
  • win10任务栏图标怎么变小_win10任务栏图标缩小方法

    可通过任务栏设置、显示缩放、注册表修改及高DPI适配四种方法缩小Windows 10任务栏图标,提升美观与操作效率。 如果您发现Windows 10任务栏上的图标过大,影响了桌面美观或操作效率,可以通过调整任务栏设置来缩小图标尺寸。以下是几种有效的调整方法: 本文运行环境:Dell XPS 13,W…

    2026年9月3日
    000
  • 如何高效管理Magento 2模块:以wolfautoparts.com/product为例

    在为wolfautoparts.com维护其magento 2商店时,我面临的一个主要问题是如何高效地安装和升级其自定义模块wolfautoparts.com/product。每次更新或安装新模块时,都需要确保不影响网站的正常运行,同时还要处理与其他系统的集成问题。 在尝试了多种方法后,我发现使用C…

    用户投稿 2026年9月3日
    100
  • 华硕电脑硬盘错误代码0x0000007A的故障排查与数据恢复方法

    华硕电脑硬盘错误代码0x0000007A的故障排查与数据恢复方法华硕电脑硬盘错误代码0x0000007A的故障排查与数据恢复方法华硕电脑硬盘错误代码0x0000007A的故障排查与数据恢复方法华硕电脑硬盘错误代码0x0000007A的故障排查与数据恢复方法

    蓝屏错误代码0x0000007a通常由内存访问问题引起,可能涉及硬件或驱动程序。1. 检查内存条是否松动或损坏,取下擦拭金手指并重新插好,尝试更换插槽或逐一测试多根内存条;2. 使用windows内置内存诊断工具(mdsched.exe)重启检测内存错误;3. 更新或回滚显卡等设备驱动程序,建议使用…

    2026年9月3日 用户投稿
    000
  • 电脑主机电源供应不足故障排查及电源更换建议

    电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议电脑主机电源供应不足故障排查及电源更换建议

    电脑电源供电不足会导致系统不稳定甚至无法开机,解决方法包括排查症状、简化负载、软件检查、交叉测试和更换合适电源。首先观察高负载时是否黑屏、重启或外设异常;其次检查电源线、插座、风扇和灰尘情况;再拔掉非必要设备测试;接着用事件查看器和更新驱动辅助判断;有条件可用备用电源交叉测试;计算硬件总功耗并增加2…

    2026年9月3日 用户投稿
    000
  • win11怎么在任务栏显示网速_Win11任务栏网速显示设置教程

    可通过第三方软件或系统工具在Windows 11任务栏监控网速:一、在Microsoft Store安装“Net Speed Monitor”等应用,启用任务栏显示实时上传下载速度;二、通过任务管理器打开资源监视器,在“网络”选项卡查看各进程及总体吞吐量;三、在“设置-网络和Internet-高级网…

    2026年9月3日
    100
  • Win10安装后如何设置时间和日期_Win10时间日期设置方法

    首先手动调整时间或启用自动同步功能。通过设置→时间和语言→日期和时间,可手动更改或开启自动设置时间,并在需要时点击“立即同步”;若失败,可更换时间服务器。此外,也可通过控制面板或命令提示符(如time HH:MM、date MM-DD-YYYY)进行配置,确保系统时间准确。 如果您在新安装的 Win…

    2026年9月3日
    000
  • Word文档插入形状怎么做_Word文档插入形状如何做详细方法

    打开Word文档,点击“插入”选项卡中的“形状”按钮,选择所需图形并在文档中拖动绘制;2. 选中形状后拖动控制点调整大小,按住Shift键可等比例缩放,直接拖动可移动位置;3. 在“格式”选项卡中使用“形状填充”和“形状轮廓”设置颜色、边框及特效以美化样式;4. 右键形状选择“编辑文字”可添加文本,…

    2026年9月3日
    100
  • win10怎么查看已连接的wifi密码_win10查看已连接wifi密码教程

    可通过系统设置、命令提示符、控制面板或路由器管理界面查看Wi-Fi密码:①在“网络和Internet”设置中进入“管理已知网络”,点击对应Wi-Fi并勾选“显示字符”以明文显示密码;②以管理员身份运行命令提示符,执行netsh wlan show profiles列出所有网络,再用netsh wla…

    2026年9月3日
    000
  • 剪映pc版怎么背景虚化_剪映PC版视频背景虚化教程

    1、使用剪映PC版可通过画中画叠加模糊层模拟背景虚化;2、利用智能抠像精准分离人物并单独模糊背景;3、添加模糊滤镜结合蒙版实现自定义虚化范围,提升视频层次感。 如果您在剪辑视频时希望突出主体,让背景呈现出柔和的模糊效果,可以使用剪映PC版提供的背景虚化功能。这种效果常用于人像视频、Vlog或访谈类内…

    2026年9月3日
    100

发表回复

登录后才能评论
关注微信