Подтвердить что ты не робот

Float64 с pandas to_csv

Я читаю CSV с такими номерами:

Bob,0.085
Alice,0.005

И импортируйте в dataframe, и напишите этот файл данных в новое место

df = pd.read_csv(orig)
df.to_csv(pandasfile)

Теперь этот pandasfile имеет:

Bob,0.085000000000000006
Alice,0.0050000000000000001

Что случилось? может быть, мне нужно использовать другой тип, например float32 или что-то в этом роде?

Im использует pandas 0.9.0 и numpy 1.6.2.

4b9b3361

Ответ 1

Как упоминалось в комментариях, это общая проблема с плавающей точкой.

Однако вы можете использовать ключевое слово float_format to_csv, чтобы скрыть его:

df.to_csv('pandasfile.csv', float_format='%.3f')

или, если вы не хотите, чтобы 0.0001 округлялось до нуля:

df.to_csv('pandasfile.csv', float_format='%g')

предоставит вам:

Bob,0.085
Alice,0.005

в вашем выходном файле.

Для объяснения %g см. Формат спецификации Mini-Language.

Ответ 2

UPDATE: ответ был точным на момент написания, а точность с плавающей запятой по-прежнему не является чем-то, что вы получаете по умолчанию с помощью to_csv/read_csv (высокопроизводительный компромисс, эффективность использования по умолчанию).

В настоящее время существует аргумент float_format доступный для pandas.DataFrame.to_csv и аргумент float_precision доступный для pandas.from_csv.

Оригинал все еще стоит прочитать, чтобы лучше понять проблему.


Это была ошибка в пандах не только в функции "to_csv", но и в "read_csv". Это не общая проблема с плавающей точкой, несмотря на то, что арифметика с плавающей запятой является предметом, требующим некоторой осторожности от программиста. В этой статье ниже приводится небольшая часть этой темы:

http://docs.python.org/2/tutorial/floatingpoint.html

Классический однострочный, который показывает "проблему"...

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

... который не отображает 0,3, как можно было бы ожидать. С другой стороны, если вы обрабатываете вычисления с использованием арифметики с фиксированной точкой, и только на последнем этапе вы используете арифметику с плавающей запятой, она будет работать так, как вы ожидаете. Видеть это:

>>> (1 + 1 + 1)  * 1.0 / 10
0.3

Если вам отчаянно нужно обойти эту проблему, я рекомендую вам создать другой CSV файл, который содержит все цифры в виде целых чисел, например умножение на 100, 1000 или другой коэффициент, который оказывается удобным. Внутри приложения прочитайте CSV файл, как обычно, и верните эти цифры. Затем преобразуйте эти значения в плавающую точку, разделив их на тот же коэффициент, который вы умножали раньше.