【问题标题】:Python and importing floating-point numbers from the excel filePython并从excel文件中导入浮点数
【发布时间】:2016-11-14 10:22:35
【问题描述】:

所以我有一个看起来像这样的 excel 文件

    Name    R   s   l2  max_amplitude   ref_amplitude
    R_0.3_s_0.5_l2_0.1  0.3 0.5 0.1 1.45131445  1.45131445
    R_0.3_s_0.5_l2_0.6  0.3 0.5 0.6 3.52145743  3.52145743
   ...
    R_1.1_s_2.0_l2_1.6  1.1 2.0 1.6 5.07415199  5.07415199
    R_1.1_s_2.0_l2_2.1  1.1 2.0 2.1 5.78820419  5.78820419
    R_1.1_s_2.0_l2_2.6  1.1 2.0 2.6 5.84488964  5.84488964
    R_1.1_s_2.0_l2_3.1  1.1 2.0 3.1 6.35387516  6.35387516

使用 pandas 模块将数据导入数据框

import pandas as pd
df = pd.read_excel("output_var.xlsx", header=0)

一切似乎都很好:

df

在命令行中产生:

       R    s   l2  max_amplitude  ref_amplitude
0    0.3  0.5  0.1       1.451314       1.451314
1    0.3  0.5  0.6       3.521457       3.521457
2    0.3  0.5  1.1       4.770226       4.770226
...
207  1.1  2.0  2.1       5.788204       5.788204
208  1.1  2.0  2.6       5.844890       5.844890
209  1.1  2.0  3.1       6.353875       6.353875

[210 rows x 5 columns]

现在我需要根据 R 的值进行一些计算,所以我需要对数组进行切片。 R 列包含 5 个不同的值:0.3、0.5、0.7、0.9 和 1.1。这 5 个值中的每一个都有 42 行。 (5x42=210) 要从“R”中删除重复项,我尝试

set(df.R)

返回:

{0.29999999999999999,
 0.5,
 0.69999999999999996,
 0.89999999999999991,
 0.90000000000000002,
 1.1000000000000001}

除了将 0.3 表示为 0.29999 等之外,还有 6 个(而不是 5 个)不同的 R 值。有时 0.9 被解释为 0.899999999999999991,有时被解释为 0.90000000000000002 这可以(部分)解决:

set(round(df.R,1))

其中(至少)返回 5 个值:

{0.29999999999999999,
 0.5,
 0.69999999999999996,
 0.90000000000000002,
 1.1000000000000001}

但现在我来到了危险的部分。如果我想根据 R 的已知值(0.3、0.5、0.7、0.9 和 1.1)进行切片

len(df[df.R==0.3])

返回

42

len(df[df.R==0.9])

返回

41

一个值被 Python 删除了! (请记住,5 个 R 中的每一个都有 42 行,因此文件中的总行数为 210 行)。 如何处理这个问题?

【问题讨论】:

    标签: python excel pandas import floating


    【解决方案1】:

    不要检查浮点数是否相等。浮点运算存在一些问题(例如检查here)。

    相反,检查closeness(非常接近):

    import numpy as np
    len(df[np.isclose(df.R, 0.9)])
    

    通常,如果您不将系列转换为集合,pandas 会处理。因此,如果您想删除重复项,我建议使用 pandas 方法:

    df.drop_duplicates('R')
    

    【讨论】:

    • 感谢您的及时回复,但是 pandas 'drop_duplicates' 并没有解决浮点问题:'df.R.drop_duplicates()' yield: ' 0.3 0.5 0.7 0.9 0.9 1.1 ' 所以我还是有两个“不同”的 0.9 值
    • @Mato 你确定它们在 Excel 文件中是一样的吗?如果可能的话,你能分享文件(或其中的一部分)吗?
    • 在 excel 中,R=0.9 的数据看起来确实相同,但我只是尝试将数据快速导入 Mathematica 并出现同样的问题(两个 0.9 值)。因此,问题似乎出在数据中(尽管 Excel 文件是使用 pandas 'to_excel' 命令生成的)。我将不得不在那里搜索问题。
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多