python - Pandas - Excel 浮点解释错误

标签 python excel pandas

<分区>

我有这样一个 Excel 文件:

enter image description here

当我尝试将其作为数据框读取然后将其转换为字典时...

df = pd.read_excel(r"C:\Users\crd\Downloads\Classeur1.xlsx", sheet_name = "Feuil1", encoding="Latin-1")

print(df)

...我有这个输出:

  Label    Value1    Value2
0     C  -0.50000   1.80000
1     A  92.92768  92.92768

但是当我想将它转换成字典时,我得到了这个输出:

[
    {'Label': 'C', 'Value1': -0.5, 'Value2': 1.7999999999999998}, 
    {'Label': 'A', 'Value1': 92.92768, 'Value2': 92.92768}
]

为什么 1.8 在 dataframe 转换为 dict 之后变成 1.7999999999999 而不是在创建时变成 1.7999999?

最佳答案

在 Python(和任何编程语言)中,实数是使用计算机中离散数量的内存位来表示的。这意味着并非所有实数都可以精确表示超过给定精度。 Python 在 the documentation 中对其工作原理进行了详尽的解释。 .

有一些选项可以精确地表示一组具有固定精度的十进制数。例如,您可以使用 the built in Decimal class在从 Excel 中读取 float 后表示它们。这可以为您提供数据的准确表示。

如果您在 SO 上搜索“浮点表示法”,您会发现许多有趣的问题来说明其工作原理。例如 this question 的可接受答案解释了如何在 Python 中查看和解释 float 的精确二进制表示。

关于这个问题的最后一个想法是,Excel 非常擅长在电子表格中显示与其存储在计算机内存中的底层表示形式不同的值。有各种各样的选项可以改变显示的内容。所以我经常喜欢将我的 Excel 数据写入 .csv 或其他文本文件格式,然后将文本文件读入 Python。文本文件中的值将是与 Python 中的表示进行比较的更好的引用点。

关于python - Pandas - Excel 浮点解释错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58613071/

相关文章:

python - 将一组符号线性方程转换为矩阵形式

python - 如果不为空,则从现有数据框列创建新数据框

java - 传递字符串对象时使用 apache poi 格式化日期

python - 从具有以特定单词开头的索引的 Pandas 系列中删除元素

python - 如果状态发生变化,如何打印一次(不能多次)?

java - Apache POI SAX 解析 - 如何获取单元格的实际值

Excel:通过评估其他列中的数据与第三列中的匹配数据来编辑列数据

python - 用于附加和创建 pandas 数据帧的快速 numpy 数组结构

python - 如何根据前一行信息更新pandas DataFrame

python - 如何使用 ldap3 python 模块强制用户在下次登录时更改密码?