Pandas сохранение неверных значений с плавающей точкой - PullRequest
0 голосов
/ 04 мая 2020

Когда я читаю файл .csv с помощью pandas, а затем снова сохраняю его, значения в некоторых строках изменяются, например, с 0,007 до 0,006999999999999999. Вот пример, чтобы лучше понять проблему:

d3 = pd.read_csv("third_table.csv", sep=';') # read the original csv
d3 = d3.loc[322:325] # I just selected these rows for this example because row 322 has this problem
d3['value'] = d3['value'].astype(float) # just to avoid questions about which type is the data in this column
print(d3[d3.value == 0.006999999999999999]) # returns empty dataframe
print(d3.iloc[0].value) # returns 0.07
d3.to_csv("~/Desktop/test.csv", sep=';', index=False) # saving to file

А затем

d_test = pd.read_csv("~/Desktop/test.csv", sep=';') # reading newly created file
print(d_test[d_test.value == 0.006999999999999999]) # returns one row
print(d_test.iloc[0].value) # returns 0.006999999999999999

Почему это происходит и как я могу помешать pandas сделать это ? Кроме того, исходный файл уже содержит около 200 строк с такими длинными значениями с плавающей запятой, и когда я попытался просто прочитать, а затем записать в новый файл, количество строк с проблемными значениями c немного уменьшилось.

Я также проверил файл напрямую, и новый файл для этого конкретного случая, кажется, имеет правильное значение 0,007, записанное в нем, так почему он читает его неправильно? (d-тип столбца 'value' в новом файле - float)

А также следующий вопрос. Каков наилучший способ округлить такие числа с плавающей запятой 0,006999999999999999, если я не знаю заранее, сколько должны быть цифры после точки (могут быть числа 0,006999999999999999 и 0,06999999999999999 в столбце).

1 Ответ

1 голос
/ 04 мая 2020

Когда вы пишете csv, вы можете добавить float_format = '%. 3f', например, d3.to_csv ("~ / Desktop / test.csv", sep = ';', float_format = '%. 3f', index = Неверно)

Еще один способ исправить ситуацию - избегать использования float. Вы можете умножить столбец на 1000 и поделить на 1000 в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...