Функция округления округляет все записи в столбцах, кроме трех - PullRequest
0 голосов
/ 08 ноября 2019

Использую следующую функцию:

def round_half_away_from_zero(n, decimals=1):
    rounded_abs = round_half_up(abs(n), decimals)
    return math.copysign(rounded_abs, n)   

def round_half_up(n, decimals=1):
    multiplier = 10 ** decimals
    return math.floor(n*multiplier + 0.5) / multiplier

def round_half_down(n, decimals=1):
    multiplier = 10 ** decimals
    return math.ceil(n*multiplier - 0.5) / multiplier

df['temp'] = df3['temp'].apply(lambda x: round_half_away_from_zero(x))

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

  • 63,5 = 63,5
  • 58,355 = 58,4
  • 88,878 = 88,9
  • 48,75 = 48,8

Как ни странно, только три записи не работают, и они:

  • 67,75 = 67,7
  • 58,25 = 58,2
  • 46,65 = 46,6

Если я просто выполняю функцию для одного значения, оно работает, нонапример, не в серии:

round_half_away_from_zero(67.5),

работает и дает 67,8, 58,3 и 46,7 соответственно.

Любые идеи, спасибо

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

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

0 голосов
/ 08 ноября 2019

Ваш код работает - не может повторить вашу ошибку:

import pandas as pd
import math
def round_half_away_from_zero(n, decimals=1):
    rounded_abs = round_half_up(abs(n), decimals)
    return math.copysign(rounded_abs, n)   

def round_half_up(n, decimals=1):
    multiplier = 10 ** decimals
    return math.floor(n*multiplier + 0.5) / multiplier
df = pd.DataFrame( {"A": [63.5, 58.355, 88.878, 48.75] , 
                    "B": [67.75, 58.25, 46.65, 67.75] })


df['A_ok'] = df['A'].apply(lambda x: round_half_away_from_zero(x))
df['B_ok'] = df['B'].apply(lambda x: round_half_away_from_zero(x))

print(df)

Вывод:

# python 2.7
        A      B  A_ok  B_ok
0  63.500  67.75  63.5  67.8
1  58.355  58.25  58.4  58.3
2  88.878  46.65  88.9  46.7
3  48.750  67.75  48.8  67.8

# python 3.6
        A      B  A_ok  B_ok
0  63.500  67.75  63.5  67.8
1  58.355  58.25  58.4  58.3
2  88.878  46.65  88.9  46.7
3  48.750  67.75  48.8  67.8
...