Раунд около 0,05 убирает один ди git из результатов - PullRequest
4 голосов
/ 09 июля 2020

У меня есть таблица pandas с двумя столбцами с числовыми данными (dtype flaot64). Я округлил каждый столбец так, чтобы после десятичной точки было 2 цифры, а затем использовал функцию для округления до почти 0,5, но по какой-то причине только один столбец был округлен до 0,05, а второй был округлен, но пропустил 2-й di git.

Это фальшивый пример, который работает и показывает поток:

table=pd.DataFrame({'A': [0.62435, 0.542345,0.213452],
                   'B': [0.22426,0.15779,0.30346]})

#function for round to near 0.5:
def custom_round(x, base=5):
    return base * round(float(x)/base)

table['A'] = table['A'].astype(float).round(2).apply(lambda x: custom_round(x, base=.05))
table['B'] = table['B'].astype(float).round(2).apply(lambda x: custom_round(x, base=.05))
table

>>>

A   B
0   0.60    0.20
1   0.55    0.15
2   0.20    0.30

но на моем столе я получаю в итоге:

enter image description here

When I run the script without the function to round near 0.5, I still get the two digits:

table['B'] = table['B'].round(2)

введите описание изображения здесь

У меня вопрос: почему это происходит? и как я могу это исправить, чтобы округлить оба столбца до 0,05 и отобразить обе цифры?

изменить: меня спросили, как применить это к моей реальной таблице, поэтому:

df['A'] = df['A'].astype(float).round(2).apply(lambda x: custom_round(x, base=.05))
df['B']= df['B'].round(2).apply(lambda x: custom_round(x, base=.05))

Ответы [ 3 ]

4 голосов
/ 17 июля 2020

Ваши числа округлены правильно. Ниже я объясню:

  1. Как показать 2-значную точность?
  2. Что происходило с данными примера?

1. Как показать 2-значную точность?

Если вы действительно хотите, чтобы отображало две цифры , вы можете полностью пропустить функцию округления (custom_round) и просто запустить это * перед печатью вашего dataframes:

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

При этом данные с плавающей запятой будут печататься с точностью до 2 цифр. Пример:

table=pd.DataFrame({'A': [0.62435, 0.542345,0.213452],
                   'B': [0.22426,0.18779,0.30346]})
In [1]: table
Out[1]:
     A    B
0 0.62 0.22
1 0.54 0.19
2 0.21 0.30

2. Что происходит с данными примера?

  • Использование тех же данных, что и в вопросе
table=pd.DataFrame({'A': [0.62435, 0.542345,0.213452],
                   'B': [0.22426,0.15779,0.30346]})

# execute code with custom_round in the question

In [1]: table
Out[1]:
      A     B
0  0.60  0.20
1  0.55  0.15
2  0.20  0.30
  • Установка среднего значения B на 0,18779 ( округлено до 0,20)
table=pd.DataFrame({'A': [0.62435, 0.542345,0.213452],
                   'B': [0.22426,0.18779,0.30346]})

# execute code with custom_round in the question

In [1]: table
Out[1]:
      A    B
0  0.60  0.2
1  0.55  0.2
2  0.20  0.3

Почему это происходит?

Внутренне , число округляется с точностью до двух ди git. Когда вы печатаете таблицу в консоли / блокноте Jupyter, pandas пропускает печать последнего значения (2nd di git), если все они являются нулями. Итак, данные - это двухзначная точность (например, 0.20), но это только что показано с одним di git precision , поскольку 0.20 = 0.2.

* Вы также можете использовать другую схему печати: pd.options.display.float_format можно установить для любого вызываемого объекта, который

[...] принимает плавающую точку. number и верните строку с желаемым форматом числа. Это используется в некоторых местах, например в SeriesFormatter. См. Пример в core.format.EngFormatter.

1 голос
/ 18 июля 2020
В

Pandas есть эта вещь, которая удаляет конечные нули для цифр после конечных нулей. Я предполагаю, что это своего рода особенность или ошибка. Если вы просто хотите видеть результат с правильной точностью на вашем дисплее / печати, пробовали ли вы опцию display_precison, например

pd.set_option ('precision', 2)

Или измените От 2 до 3 или 4, чтобы поиграть. Я думаю, что это вариант глобальной точности отображения, поэтому, если вы хотите отображать различную точность для разных столбцов, это будет проблемой.

1 голос
/ 11 июля 2020

На втором снимке экрана второе значение в столбце B равно 0,22, которое затем округлено до 0,2. Все значения на втором скриншоте округляются до 0.x0. Таким образом, отсутствующий последний di git - это функция из GUI, подавляющая завершающий 0.

Вероятно, ошибка не в округлении до 0,05. Это было до этого.

Похоже, что округление до двух цифр с использованием round (2) не применяется к входным данным в вашем примере (второе значение в B в вашем примере - 0,15779.

...