0

0

比较Pandas DataFrame中含NaN的浮点数列差异

霞舞

霞舞

发布时间:2025-10-08 14:12:19

|

420人浏览过

|

来源于php中文网

原创

比较Pandas DataFrame中含NaN的浮点数列差异

本教程旨在解决Pandas DataFrame中浮点数列比较的常见挑战,特别是涉及浮点精度问题和NaN值处理。我们将探讨如何通过对浮点数进行四舍五入来消除精度差异,并利用pandas.DataFrame.compare方法有效地识别并统计两个DataFrame中指定列的差异行数,同时正确处理NaN值,确保NaN与NaN不被误判为差异。

浮点数列比较的挑战

在数据分析中,我们经常需要比较两个结构相似的dataframe中特定列的数值差异。然而,当这些列包含浮点数和nan(not a number)值时,直接进行相等性比较会遇到一些固有问题:

  1. 浮点数精度问题: 由于浮点数在计算机内部的表示方式,即使逻辑上相等的两个浮点数,在直接比较时也可能因为微小的精度差异而被判定为不相等。例如,0.1 + 0.2可能不严格等于0.3。
  2. NaN值的特殊性: 在Python和Pandas中,NaN是一个特殊的浮点值,其特点是NaN != NaN(NaN与自身不相等)。这意味着如果两个DataFrame的同一位置都包含NaN,直接比较会将其视为差异,而这往往不是我们期望的结果。通常,我们希望NaN与NaN被视为相等,不计入差异。

为了克服这些挑战,我们需要一种鲁棒的方法来准确地比较浮点数列并统计差异。

解决方案:结合四舍五入与DataFrame.compare

Pandas库提供了强大的工具来处理这类问题。我们的解决方案将分两步进行:首先,通过四舍五入处理浮点精度问题;其次,利用pandas.DataFrame.compare方法进行高效且智能的比较。

1. 处理浮点数精度:四舍五入

在比较浮点数之前,对其进行适当的四舍五入是解决精度问题的有效方法。通过将浮点数截断到相同的有效小数位数,我们可以消除那些不影响业务逻辑的微小差异。

实现方式: 使用Series或DataFrame的.round()方法对目标列进行四舍五入。你需要根据数据的实际精度要求来选择合适的四舍五入位数。

import pandas as pd
import numpy as np

# 示例数据
d1 = {"col": [7.1, 2.0, 3.0, 4.0, None, 1.9, 1.3]}
d2 = {"col": [7.1, 2.5, 3.0, 4.0, None, 1.2, np.nan]} # 使用np.nan更规范

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

print("原始DataFrame 1:\n", df1)
print("\n原始DataFrame 2:\n", df2)

# 对目标列进行四舍五入,例如保留4位小数
# 这一步确保了即使原始数据有微小的精度差异,在比较前也会被标准化
df1["col"] = df1["col"].round(4)
df2["col"] = df2["col"].round(4)

print("\n四舍五入后的DataFrame 1:\n", df1)
print("\n四舍五入后的DataFrame 2:\n", df2)

注意事项:

  • 选择合适的四舍五入位数至关重要。过高的位数可能无法解决精度问题,过低的位数则可能丢失有效信息。
  • None在Pandas中会被自动转换为np.nan。

2. 比较DataFrame并统计差异:DataFrame.compare

pandas.DataFrame.compare方法是专门设计用于比较两个DataFrame并突出显示差异的工具。它的一个关键特性是能够智能地处理NaN值:默认情况下,如果两个DataFrame的同一位置都包含NaN,compare方法会将其视为相等,不会在结果中显示该行。如果一个位置是NaN而另一个是有效值,则会被视为差异。这完美符合了我们“NaN与NaN不计入差异”的需求。

AlibabaWOOD
AlibabaWOOD

阿里巴巴打造的多元电商视频智能创作平台

下载

实现方式: 直接调用其中一个DataFrame的.compare()方法,并传入另一个DataFrame作为参数。

# 使用compare方法比较两个DataFrame
# 默认情况下,如果两个DataFrame在同一位置都为NaN,该行不会出现在结果中。
# 如果一个为NaN,另一个为值,则会被视为差异。
comparison = df1.compare(df2)

print("\n差异比较结果:\n", comparison)

# 统计差异行数
# comparison DataFrame的每一行代表一个存在差异的原始行
different_rows_count = len(comparison)
print("\n不同行数:", different_rows_count)

输出解读:compare方法返回一个DataFrame,其中只包含存在差异的行。该DataFrame的列会进行多级索引,通常是('col_name', 'self')和('col_name', 'other'),分别表示原始DataFrame(调用compare的DataFrame)和传入的DataFrame在该位置的值。

对于上述示例数据,输出将是:

差异比较结果:
   col      
  self other
1  2.0   2.5
5  1.9   1.2
6  1.3   NaN

不同行数: 3

从输出可以看出:

  • 第1行(索引为1)的col列,df1中是2.0,df2中是2.5,被识别为差异。
  • 第5行(索引为5)的col列,df1中是1.9,df2中是1.2,被识别为差异。
  • 第6行(索引为6)的col列,df1中是1.3,df2中是NaN,被识别为差异。
  • 原始数据中索引为4的行,df1和df2的col列都为NaN(或None),因此没有出现在差异结果中,符合我们的预期。

总结

通过结合浮点数列的四舍五入处理和pandas.DataFrame.compare方法,我们可以高效且准确地识别并统计两个DataFrame中浮点数列的差异行数。这种方法不仅解决了浮点精度带来的比较问题,还智能地处理了NaN值,确保了比较结果的准确性和业务逻辑的符合性。在实际应用中,根据数据特性选择合适的四舍五入精度是关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

71

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2

2026.01.31

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

13

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

22

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

13

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

2

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

11

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

101

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

2

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号