Как мне избежать, чтобы мой кусок кода Python агрессивно округлял значения до 1 знака после запятой - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь создать новый столбец в моем фрейме данных pandas, который является результатом базового математического уравнения, выполненного для других столбцов в наборе данных.Проблема в том, что значения, захваченные в столбце, чрезвычайно округлены и не представляют истинные значения.

2.5364 не следует округлять до 2,5, а 3,775 не следует округлять до 3,8

*.1004 * Я попытался объявить знаменатели как числа с плавающей запятой, чтобы обмануть систему и предоставить значения, которые выглядят так.то есть 12 / 3.00 должно быть 4.00, но это все еще возвращает 4.0.

Это то, что я сейчас делаю:

normal_load = 3
df['FirstPart_GPA'] = ((df[first_part].sum(axis = 1, skipna = True))/(normal_load*5.00))

Я установил для skipna значение true, потому что иногда столбец может не иметьлюбое значение, но я все еще хочу иметь возможность вычислять средний балл без каких-либо ошибок системы, поскольку любое число плюс NAN даст NAN.

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

dict = {'course1': [15,12],
        'course2': [9,6],
        'course3': [12,15],
        'course4': [15,3],
        'course5': [15,9],
        'course6': [9,12]}

df = pd.DataFrame(dict)

Обратите внимание, что у меня есть некоторые нулевые значения, потому что некоторые курсы являются факультативными.Пожалуйста, помогите мне.У меня нет идей.

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Вы не определили переменную first_part в своем коде, поэтому я предполагаю, что это некоторое подмножество столбцов данных, например:

first_part=['course1', 'course2', 'course3']

Все числа в вашем фрейме данных являются целыми числами, кратными 3, поэтому, когда вы суммируете любое из них и делите на 15, вы всегда получите десятичное число, состоящее не более чем из 1 цифры после десятичной точки. Ваши значения не округлены, они точны.

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

pd.options.display.float_format = '{:,.2f}'.format

Теперь

df['FirstPart_GPA'] = ((df[first_part].sum(axis = 1, skipna = True))/(normal_load*5.00))
df
course1 course2 course3 course4 course5 course6 FirstPart_GPA
0   15  9   12  15  15  9   2.40
1   12  6   15  3   9   12  2.20
1 голос
/ 22 мая 2019

Вы можете добавить форматирование с плавающей запятой примерно так:

result= "%0.2f" % your_calc_result

Пример использования этого кода:

dict = {'course1': [15,12],
        'course2': [9,6],
        'course3': [12,15],
        'course4': [15,3],
        'course5': [15,9],
        'course6': [9,12]}
df = pd.DataFrame(dict)
normal_load = 3.0
result=[]
for i in range(len(df.index)):
    result.append("%0.2f" % (float(df.loc[i].sum())/(normal_load*5.00)))
df['FirstPart_GPA']=result

Вывод:

   course1  course2  course3  course4  course5  course6 FirstPart_GPA
0       15        9       12       15       15        9          5.00
1       12        6       15        3        9       12          3.80
0 голосов
/ 22 мая 2019

OMG!Теперь я вижу, в чем проблема.Я просто бросил свой файл в Excel и сделал расчет, и оказалось, что код в порядке.Мне жаль, что я потратил любое ваше время, и в то же время я ценю ваш быстрый ответ.

Я всегда предполагал, что в GPA будет много десятичных знаков, но в коде используется 5-балльная система оценки, которая означает, что еслиу студента есть A по курсу, у которого нагрузка по курсу 3, она набрала бы 15 баллов.

Студент должен пройти 5 курсов в семестр.Все 5 курсов имеют нагрузку 3. Это означает, что все 5 курсов = 15.

Таким образом, поскольку возможные значения, которые может иметь студент, в основном кратны 3 (0,3,6,9,12,15), когда мы разделим сумму всех его единиц по всем 5 курсам на 15, 3 всегда будет проходить через нее, то есть 3 + 12 + 12 + 3 + 9/15 = 13/5

5 настолько проблематичнои это в основном не будет распространяться на дополнительные десятичные числа в отличие от 10/3, которое продолжает давать мне рекурсивные 3-е в десятичной части, 5 - кооперативное.Поэтому 13/5 = 2,6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...