Отформатируйте определенные плавающие столбцы данных в процентах в pandas
Я пытаюсь написать документ в ноутбуке IPython, но столкнулся с некоторыми проблемами с форматом отображения. Предположим, что у меня есть следующий файл данных df
, есть ли способ форматировать var1
и var2
в двухзначные десятичные числа и var3
в процентах.
var1 var2 var3
id
0 1.458315 1.500092 -0.005709
1 1.576704 1.608445 -0.005122
2 1.629253 1.652577 -0.004754
3 1.669331 1.685456 -0.003525
4 1.705139 1.712096 -0.003134
5 1.740447 1.741961 -0.001223
6 1.775980 1.770801 -0.001723
7 1.812037 1.799327 -0.002013
8 1.853130 1.822982 -0.001396
9 1.943985 1.868401 0.005732
Число внутри не умножается на 100, например. -0,0057 = -0,57%.
Ответы
Ответ 1
заменить значения с помощью круглой функции и форматировать строковое представление процентных чисел:
df['var2'] = pd.Series([round(val, 2) for val in df['var2'], index = df.index])
df['var3'] = pd.Series(["{0:.2f}%".format(val * 100) for val in df['var3']], index = df.index)
Функция round округляет число с плавающей запятой до количества десятичных знаков, предоставленных в качестве второго аргумента функции.
Форматирование строк позволяет вам представлять номера по своему усмотрению. Вы можете изменить количество знаков после запятой, показанных путем изменения числа до f
.
p.s. Я не был уверен, что ваши "процентные" числа уже были умножены на 100. Если у них тогда будет ясно, что вы захотите изменить количество отображаемых десятичных знаков и удалите сто умножений.
Ответ 2
Принятый ответ предлагает изменить исходные данные для целей презентации, чего вы обычно не хотите. Представьте, что вам нужно провести дальнейшие анализы с этими столбцами, и вам нужна точность, которую вы потеряли при округлении.
Вы можете изменить форматирование отдельных столбцов в кадрах данных, в вашем случае:
output = df.to_string(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
print(output)
Для вашей информации '{:,.2%}'.format(0.214)
выдается 21.40%
, поэтому нет необходимости умножать на 100.
У вас больше нет хорошей таблицы HTML, а текстовое представление. Если вам нужно остаться с HTML, используйте функцию to_html
.
from IPython.core.display import display, HTML
output = df.to_html(formatters={
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format
})
display(HTML(output))
Ответ 3
Вы также можете установить формат по-умолчанию для float:
pd.options.display.float_format = '{:.2f}%'.format
Ответ 4
Как было предложено в @linqu, вы не должны изменять свои данные для презентации. Поскольку pandas 0.17.1, (условное) форматирование стало проще. Цитирование документации:
Вы можете применить условное форматирование, визуальный стиль DataFrame
в зависимости от данных внутри, используя свойство DataFrame.style
. Это свойство, которое возвращает объект pandas.Styler
, который имеет полезные методы для форматирования и отображения DataFrames
.
В вашем примере это будет (обычная таблица появится в Jupyter):
df.style.format({
'var1': '{:,.2f}'.format,
'var2': '{:,.2f}'.format,
'var3': '{:,.2%}'.format,
})
Ответ 5
Как аналогичный подход к принятому ответу, который может считаться более читаемым, изящным и общим (YMMV), вы можете использовать метод map
:
# OP example
df['var3'].map(lambda n: '{:,.2%}'.format(n))
# also works on a series
series_example.map(lambda n: '{:,.2%}'.format(n))
По производительности, это довольно близко (чуть медленнее), чем решение OP.
В стороне, если вы решите пойти по маршруту pd.options.display.float_format
, рассмотрите возможность использования диспетчера контекста для обработки состояния в этом параллельном примере с числом пикселей.