Как сократить цифры в колонках таблицы до двух сотых, применяя .style в функции? python

Рейтинг: 0Ответов: 1Опубликовано: 01.06.2023

Пишу функцию для вывода таблиц с одинаковым стилем. Никак не могу в колонках с типом float сократить цифры до двух сотых. Вернее убрать лишние нули.

Сейчас таблица выглядит так. введите сюда описание изображения

Мой код:

def style_data(data):

data = np.round(data, decimals=2)

#оглавление  
th_props = [
    ('font-size', '14px'),
    ('text-align', 'center'),
    ('border', "0.5px solid black")
]

#офоромление содержания 
td_props = [
    ('font-size', '13px'),
    ('text-align', 'center'),
    ('border', "0.5px solid black")
]

#set style
styles = [
    dict(selector="th", props=th_props), #наименование колонок
    dict(selector="td", props=td_props), #данные таблицы
    dict(selector="caption",             #оглавление таблицы
         props=[("text-align", "center"),
                ("font-size", "125%"),
                ('font-weight', 'bold'),
                ("color", 'black'),
                ('border', "1px solid black")])
]
 
return (data
        .style   
        .set_table_styles(styles)                             #применение set styles
        .set_caption('Топ 5 игровых платформ за весь период')
        .set_properties(**{'width': '200px'})                 #изменение ширины ячеек
        .hide_index()
       )

Проблема заключается в том, что таблицы бывают с разным количеством колонок. И если применять к .style - .format('{:.2f}'), то без subset код ругается на колонки с не числовым типом данных. Я тогда пробовала задать параметры с d = None (возможностью отключить неважные), пробовала *args, **kwargs. У меня не сработало, но в целом мне бы не хотелось задавать кучу параметров в ручную.

Также вместо кода:

data = np.round(data, decimals=2)

Я делала:

for i in top_platforms.columns:
    if pd.api.types.is_numeric_dtype(top_platforms.columns):
        top_platforms.columns=round(top_platforms.columns), 2

Не сработало, но в целом думаю косячно получилось.

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

Ответы

▲ 2Принят

Сделайте выборку по типам колонок.

Имеем:

import pandas as pd
import numpy as np

df = pd.DataFrame({"a":["b", "c", "d"], 1:[2.123312,3.33333123123,4]})
   a         1
0  b  2.123312
1  c  3.333331
2  d  4.000000

делаем выборку и округляем:

numerics = df.select_dtypes(include="number")
df.loc[:, numerics.columns] = np.round(numerics, 2)

Теперь df:

   a     1
0  b  2.12
1  c  3.33
2  d  4.00

UPDATE

Если проблема возникает из-за применения стилей, то достаточно просто использовать:

df.style.format(precision=2)

при этом не нужно вычислять колонки с числами и проводить округление.