Python并从excel文件导入浮点数

时间:2016-07-12 09:06:17

标签: python excel pandas import floating

所以我有一个看起来像这样的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等之外,R还有6个(而不是5个)不同的值。有时0.9的接缝被解释为0.89999999999999991,有时为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行的总数)。 如何处理这个问题?

1 个答案:

答案 0 :(得分:4)

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

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

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

通常情况下,如果你没有将系列转换成一个集合,pandas会处理它。因此,如果你想删除重复项,我建议使用pandas方法:

df.drop_duplicates('R')