Округление вычисляемого столбца до 1дп - PullRequest
1 голос
/ 28 января 2020

Я понимаю, что это популярный запрос, но я не нашел здесь ничего, что бы соответствовало тому, что мне нужно. У меня есть столбец в таблице, который округляет 36,25 до 36,2, а не 36,3. Прочитав об этом подробно здесь, я ценю детали, однако это не помогает мне решить мою проблему. Как я могу создать некоторый код, который будет округлять мою колонку «Результат», как я sh, пожалуйста? Этот код создает версию df, которую я использую:

import pandas as pd
import numpy as np

raw_data = {'AreaCode' : ['101', '102', '103', '104'],
            'Numerator' : [300, 500, 600, 667],
            'Denominator' : [1000, 780, 1100, 1840]}
Data = pd.DataFrame(raw_data, columns = ['AreaCode', 'Numerator', 'Denominator'])

И затем я пытаюсь добавить столбец «Результат»:

Data['Outcome'] = Data['Numerator'] / Data['Denominator'] * 100

Производит таблицу ниже:

AreaCode|Numerator|Denominator|Outcome
101|300|1000|30.000000 
102|500|780|64.102564 
103|600|1100|54.545455
104|667|1840|36.25000

Что хорошо, кроме случаев, когда я применяю Data = Data.round(1) к этому, оно округляется с 36.250000 до 36.2. Мне нужно, чтобы этот столбец показывал 1dp как 36.3, но как я могу кодировать это в Python. Примеры того, как это сделать, используют строки из одноразовых чисел, введенных пользователем, а не весь столбец df.column. Это не позволит мне передать мою колонку df.column в эти. Один пример, который я пробовал, который не работал:

import math
def my_round(n, ndigits):
    part = n * 10 ** ndigits
    delta = part - int(part)
    # always round "away from 0"
    if delta >= 0.5 or -0.5 < delta <= 0:
        part = math.ceil(part)
    else:
        part = math.floor(part)
    return part / (10 ** ndigits

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я немного подправил вашу функцию, и теперь она работает:)

def my_round(n, ndigits=1):
    try:
       part = n * 10 ** ndigits
       delta = part - int(part)
       # always round "away from 0"
       if delta >= 0.5 or -0.5 < delta <= 0:
           part = math.ceil(part)
       else:
           part = math.floor(part)
       val =  part/(10 ** ndigits)
    except ValueError:
       val = np.nan
    return val

Data['Outcome'] = (Data['Numerator'].divide(Data['Denominator'])*100).apply(my_round)
print(Data)

Вывод:

  AreaCode  Numerator  Denominator  Outcome
0      101        300         1000     30.0
1      102        500          780     64.1
2      103        600         1100     54.5
3      104        667         1840     36.3
0 голосов
/ 28 января 2020

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

import pandas as pd
pd.options.display.float_format = '{:.1f}'.format
...