Python并从Excel文件导入浮点数字

所以我有一个像这样的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行。 (5×42 = 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)) 

(至less)返回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中的每一个,总共有210行的行数为42行)。 如何处理这个问题?

不要检查花车平等。 浮点运算有一些问题(例如,请查看这里 )。

相反,检查亲密 (真的非常接近):

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

通常情况下,如果你不把这个系列转换成一个集合,大pandas会处理这个系列。 所以,如果你想删除重复,我build议使用pandas方法:

 df.drop_duplicates('R') 
Interesting Posts