Круг панд усекается в некоторых случаях - PullRequest
0 голосов
/ 01 мая 2018

Я использую следующий код, и, как вы можете видеть во 2-й строке, округление правильное, а в 3-й строке данные усекаются.

import pandas as pd
import numpy as np

data = [[11,10],[17.50,11.01],[21.95,22.5]]
df = pd.DataFrame(data,columns=['A','B'])

df['avg'] = df[["A", "B"]].mean(axis=1)
df['avg_round'] = df['avg'].apply(lambda x: np.round(x, decimals=2)) 

enter image description here

Я тоже пробовал, и результаты идентичны:

df['avg] = df[["A", "B"]].mean(axis=1).round(2)

1 Ответ

0 голосов
/ 01 мая 2018

Это не проблема панд. Посмотрите на фактические значения avg:

>>> df['avg'][1] 
   14.254999999999999
>>> df['avg'][2]
   22.225000000000001

Если вы используете:

df['avg_round'] = df['avg'].apply(lambda x: round(x, 2))

Вы получите 14.25 и 22.23 - один округляется вверх, а другой вниз, из-за представления с плавающей запятой. Раунд Numpy, однако, даст вам 14.26 и 22.22, потому что в таких случаях он округляется до ближайшего числа , даже . Как указано в документах :

Для значений точно посередине между округленными десятичными значениями, NumPy округляет до ближайшего четного значения. Таким образом 1,5 и 2,5 округляют до 2,0, -0,5 от 0,5 до 0,0 и т. д. Результаты также могут быть неожиданными из-за неточное представление десятичных дробей в IEEE с плавающей точкой стандарт [R1011] и ошибки, допущенные при масштабировании на степени десяти.

...