Подтвердить что ты не робот

Отформатируйте определенные плавающие столбцы данных в процентах в 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%.

4b9b3361

Ответ 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, рассмотрите возможность использования диспетчера контекста для обработки состояния в этом параллельном примере с числом пикселей.