2016-07-12 2 views
4

Так у меня есть файл первенствовать, который выглядит, как этотPython и импортировать с плавающей запятой числа из файла 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 

Использование модуля панд я импортировать данные в кадр данных

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

Everything вроде нормально:

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) различные значения для Р. швов, которые иногда получает 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 

Одно значение удаляется Py тунце! (помните, что есть 42 строки для каждого из 5 R, дающих общее количество 210 строк в файле). Как справиться с этой проблемой?

ответ

4

Не проверять поплавки на равенство. Есть некоторые проблемы с арифметикой с плавающей запятой (например, here).

Вместо этого проверьте closeness (на самом деле действительно близость):

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

Обычно, если вы не преобразовать серию к набору, панды бы справиться с этим. Так что если вы хотите отказаться от дубликатов, я предложил бы использовать методы панды:

df.drop_duplicates('R') 
+0

спасибо за быстрый ответ, но панд drop_duplicates "не решает проблему с плавающей точкой: «df.R.drop_duplicates()» выходы: „ 0,3 0,5 0,7 0,9 0,9 1,1 “ Так что я до сих пор есть два„разных“0,9 значения – Mato

+0

@Mato Вы уверены, что они одинаковы в Excel файл? Можете ли вы поделиться файлом (или его частью), если это возможно? – ayhan

+0

В excel данные для R = 0.9 выглядят одинаково, но я просто попытался быстро импортировать данные в Mathematica и возникла одна и та же проблема (два значения 0.9). Таким образом, кажется, что проблемы в данных (хотя файл Excel был сгенерирован с помощью команды pandas 'to_excel'). Мне придется искать там проблему. – Mato

Смежные вопросы