Как сделать точный расчет десятичного числа в пандах? - PullRequest
0 голосов
/ 17 июня 2019

Мой фрейм данных выглядит примерно так:

import pandas as pd
df = pd.read_sql('select * from foo')

a  b  c
0.1 0.2 0.3
0.3 0.4 0.5

Если я запускаю напрямую df['a'] * df['b'] результат не такой, как я ожидал, из-за проблем с числами с плавающей запятой.

Я пытался

import Decimal

df['a'].apply(Decimal) * df['b'].apply(Decimal)

Но когда я проверяю df ['a']. Apply (Decimal) с Pycharm, столбец оказывается чем-то странным, вот только пример, а не действительные числа:

a
0.09999999999999999
0.30000000000001231

Интересно, как сделать точное умножение в пандах.

1 Ответ

0 голосов
/ 17 июня 2019

Проблема не в пандах, а в неточности с плавающей запятой: decimal.Decimal(0.1) - это Decimal('0.1000000000000000055511151231257827021181583404541015625') в моей 64-битной системе.

Простой трюк - сначала заменить числа с плавающей точкой на строки, потому что панды знаютхватит о преобразовании строк, чтобы правильно округлить значения:

x = df['a'].astype(str).apply(Decimal) * df['b'].astype(str).apply(Decimal)

Вы получите хорошую серию десятичных чисел:

>>> print(x.values)
[Decimal('0.02') Decimal('0.12')]

То есть с точным десятичным числом операций - чтоможет иметь значение, если вы обрабатываете денежные значения ...

...